?? can_fifo.c
字號:
//*****************************************************************************
//
// can_fifo.c - CAN設(shè)備在CAN的FIFO模式下進行數(shù)據(jù)收發(fā)
// 本例程將若干報文對象配置為發(fā)送FIFO,在EK-LM3S8962板上演示
// 在啟動該程序前復位2110板
//
// This is part of revision 6852 of the EK-LM3S8962 Firmware Package.
//
//*****************************************************************************
#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_sysctl.h"
#include "hw_can.h"
#include "hw_types.h"
#include "can.h"
#include "gpio.h"
#include "interrupt.h"
#include "sysctl.h"
#include "systick.h"
//#include "drivers/rit128x96x4.h"
// 為CAN控制器配置的FIFO的大小
#define CAN_FIFO_SIZE (8 * 8)
// 發(fā)送字節(jié)數(shù)
unsigned long ulBytesTransmitted;
tCANMsgObject MsgObjectTx;
//定義緩沖區(qū)
unsigned char pucBufferTx[CAN_FIFO_SIZE];
//*****************************************************************************
//
// CAN控制器的中斷處理
//
//*****************************************************************************
void
CANIntHandler(void)
{
unsigned long ulStatus;
//讀取你中斷原因
ulStatus = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE);
if(ulStatus <= 8)
{
//字節(jié)發(fā)送數(shù)自加 8
ulBytesTransmitted += 8;
}
else
{
//清除狀態(tài)中斷
CANStatusGet(CAN0_BASE, CAN_STS_CONTROL);
}
//
// Acknowledge the CAN controller interrupt has been handled.
//
CANIntClear(CAN0_BASE, ulStatus); //清除中斷
}
//*****************************************************************************
//
// 該函數(shù)配置了發(fā)送FIFO并將數(shù)據(jù)拷貝到FIFO中
//
//*****************************************************************************
int
CANTransmitFIFO(unsigned char *pucData, unsigned long ulSize)
{
int iIdx;
//配置發(fā)送報文對象
MsgObjectTx.ulMsgID = 8;
MsgObjectTx.ulMsgIDMask = 0;
MsgObjectTx.ulFlags = MSG_OBJ_TX_INT_ENABLE;
// 將8個報文對象構(gòu)成一個發(fā)送FIFO
for(iIdx = 0; iIdx < 8; iIdx++)
{
//如果還有多于8字節(jié)的數(shù)據(jù)待發(fā)送,則用滿報文形式發(fā)送8字節(jié)
if(ulSize > 8)
{
MsgObjectTx.ulMsgLen = 8;
MsgObjectTx.pucMsgData = &pucData[iIdx * 8];
// 設(shè)置標志 MSG_OBJ_FIFO 來表明這個報文對象為FIFO結(jié)構(gòu)中的一部分,且不是FIFO的最后一個報文對象
MsgObjectTx.ulFlags |= MSG_OBJ_FIFO;
//將待發(fā)送字節(jié)數(shù)變量減8
ulSize -= 8;
//啟動報文對象發(fā)送
CANMessageSet(CAN0_BASE, iIdx + 1, &MsgObjectTx, MSG_OBJ_TYPE_TX);
}
// 如果還是有少于8字節(jié)待發(fā)送數(shù)據(jù),則發(fā)送剩余數(shù)據(jù),
// 且清除標志 MSG_OBJ_FIFO 以表明這是最后一個在FIFO中的報文對象
else
{
MsgObjectTx.ulMsgLen = ulSize;
MsgObjectTx.pucMsgData = &pucData[iIdx * 8];
CANMessageSet(CAN0_BASE, iIdx + 1, &MsgObjectTx, MSG_OBJ_TYPE_TX);
}
}
return(0);
}
//*****************************************************************************
//
// 主程序
//
//*****************************************************************************
int
main(void)
{
int iIdx;
//
// LDO的輸出電壓必須在啟用PLL之前設(shè)置為2.75V
if(REVISION_IS_A2)
{
SysCtlLDOSet(SYSCTL_LDO_2_75V);
}
//時鐘配置 為50MHz
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ);
//CAN0端口配置
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
GPIOPinTypeCAN(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//配置LED所在I/O口
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0);
//關(guān)閉LED
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 0);
//使能CAN控制器
SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);
//復位后初始化CAN控制器
CANInit(CAN0_BASE);
//CAN的操作速率配置,配置為250k
CANBitRateSet(CAN0_BASE, 8000000, 250000);
//CAN0使能
CANEnable(CAN0_BASE);
//使能CAN 相關(guān)中斷
CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable(INT_CAN0);
IntMasterEnable();
//初始化數(shù)據(jù)緩沖區(qū)
for(iIdx = 0; iIdx < CAN_FIFO_SIZE; iIdx++)
{
pucBufferTx[iIdx] = iIdx + 0x1;
}
//為已發(fā)送字節(jié)數(shù)變量賦初值
ulBytesTransmitted = 0;
//配置發(fā)送FIFO,并啟動發(fā)送
CANTransmitFIFO(pucBufferTx, CAN_FIFO_SIZE);
//
// Loop forever.
//
while(1)
{
//等待所有的數(shù)據(jù)發(fā)送完畢
if(ulBytesTransmitted == CAN_FIFO_SIZE)
{
//復位該變量
ulBytesTransmitted = 0;
//LED指示
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 1); // 這里需要注意的是:在啟動報文發(fā)送前,
// 接收FIFO已經(jīng)將前次數(shù)據(jù)接收完畢,因此
SysCtlDelay(16000000 / 3); // 這里的延時時間必須大于接收FIFO的(16000000/6)
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, 0);
SysCtlDelay(16000000 / 3);
//更改緩沖區(qū)中的數(shù)據(jù)
for(iIdx = 0; iIdx < CAN_FIFO_SIZE; iIdx++)
{
pucBufferTx[iIdx] += 0xB;
}
//配置發(fā)送FIFO,并啟動發(fā)送
CANTransmitFIFO(pucBufferTx, CAN_FIFO_SIZE);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -