📄 candrv.c
字号:
can_chan_dev[i].mb11ID = M523X_CAN_MBUF11_ID(IPS_BASE,i);
can_chan_dev[i].mb11data0 = M523X_CAN_MBUF11_BYTE0(IPS_BASE,i);
can_chan_dev[i].mb11data1 = M523X_CAN_MBUF11_BYTE1(IPS_BASE,i);
can_chan_dev[i].mb11data2 = M523X_CAN_MBUF11_BYTE2(IPS_BASE,i);
can_chan_dev[i].mb11data3 = M523X_CAN_MBUF11_BYTE3(IPS_BASE,i);
can_chan_dev[i].mb11data4 = M523X_CAN_MBUF11_BYTE4(IPS_BASE,i);
can_chan_dev[i].mb11data5 = M523X_CAN_MBUF11_BYTE5(IPS_BASE,i);
can_chan_dev[i].mb11data6 = M523X_CAN_MBUF11_BYTE6(IPS_BASE,i);
can_chan_dev[i].mb11data7 = M523X_CAN_MBUF11_BYTE7(IPS_BASE,i);
can_chan_dev[i].mb12code = M523X_CAN_MBUF12_CTRL(IPS_BASE,i);
can_chan_dev[i].mb12length = M523X_CAN_MBUF12_CTRL(IPS_BASE,i);
can_chan_dev[i].mb12timestamp = M523X_CAN_MBUF12_TMSTP(IPS_BASE,i);
can_chan_dev[i].mb12ID = M523X_CAN_MBUF12_ID(IPS_BASE,i);
can_chan_dev[i].mb12data0 = M523X_CAN_MBUF12_BYTE0(IPS_BASE,i);
can_chan_dev[i].mb12data1 = M523X_CAN_MBUF12_BYTE1(IPS_BASE,i);
can_chan_dev[i].mb12data2 = M523X_CAN_MBUF12_BYTE2(IPS_BASE,i);
can_chan_dev[i].mb12data3 = M523X_CAN_MBUF12_BYTE3(IPS_BASE,i);
can_chan_dev[i].mb12data4 = M523X_CAN_MBUF12_BYTE4(IPS_BASE,i);
can_chan_dev[i].mb12data5 = M523X_CAN_MBUF12_BYTE5(IPS_BASE,i);
can_chan_dev[i].mb12data6 = M523X_CAN_MBUF12_BYTE6(IPS_BASE,i);
can_chan_dev[i].mb12data7 = M523X_CAN_MBUF12_BYTE7(IPS_BASE,i);
can_chan_dev[i].mb13code = M523X_CAN_MBUF13_CTRL(IPS_BASE,i);
can_chan_dev[i].mb13length = M523X_CAN_MBUF13_CTRL(IPS_BASE,i);
can_chan_dev[i].mb13timestamp = M523X_CAN_MBUF13_TMSTP(IPS_BASE,i);
can_chan_dev[i].mb13ID = M523X_CAN_MBUF13_ID(IPS_BASE,i);
can_chan_dev[i].mb13data0 = M523X_CAN_MBUF13_BYTE0(IPS_BASE,i);
can_chan_dev[i].mb13data1 = M523X_CAN_MBUF13_BYTE1(IPS_BASE,i);
can_chan_dev[i].mb13data2 = M523X_CAN_MBUF13_BYTE2(IPS_BASE,i);
can_chan_dev[i].mb13data3 = M523X_CAN_MBUF13_BYTE3(IPS_BASE,i);
can_chan_dev[i].mb13data4 = M523X_CAN_MBUF13_BYTE4(IPS_BASE,i);
can_chan_dev[i].mb13data5 = M523X_CAN_MBUF13_BYTE5(IPS_BASE,i);
can_chan_dev[i].mb13data6 = M523X_CAN_MBUF13_BYTE6(IPS_BASE,i);
can_chan_dev[i].mb13data7 = M523X_CAN_MBUF13_BYTE7(IPS_BASE,i);
can_chan_dev[i].mb14code = M523X_CAN_MBUF14_CTRL(IPS_BASE,i);
can_chan_dev[i].mb14length = M523X_CAN_MBUF14_CTRL(IPS_BASE,i);
can_chan_dev[i].mb14timestamp = M523X_CAN_MBUF14_TMSTP(IPS_BASE,i);
can_chan_dev[i].mb14ID = M523X_CAN_MBUF14_ID(IPS_BASE,i);
can_chan_dev[i].mb14data0 = M523X_CAN_MBUF14_BYTE0(IPS_BASE,i);
can_chan_dev[i].mb14data1 = M523X_CAN_MBUF14_BYTE1(IPS_BASE,i);
can_chan_dev[i].mb14data2 = M523X_CAN_MBUF14_BYTE2(IPS_BASE,i);
can_chan_dev[i].mb14data3 = M523X_CAN_MBUF14_BYTE3(IPS_BASE,i);
can_chan_dev[i].mb14data4 = M523X_CAN_MBUF14_BYTE4(IPS_BASE,i);
can_chan_dev[i].mb14data5 = M523X_CAN_MBUF14_BYTE5(IPS_BASE,i);
can_chan_dev[i].mb14data6 = M523X_CAN_MBUF14_BYTE6(IPS_BASE,i);
can_chan_dev[i].mb14data7 = M523X_CAN_MBUF14_BYTE7(IPS_BASE,i);
can_chan_dev[i].mb15code = M523X_CAN_MBUF15_CTRL(IPS_BASE,i);
can_chan_dev[i].mb15length = M523X_CAN_MBUF15_CTRL(IPS_BASE,i);
can_chan_dev[i].mb15timestamp = M523X_CAN_MBUF15_TMSTP(IPS_BASE,i);
can_chan_dev[i].mb15ID = M523X_CAN_MBUF15_ID(IPS_BASE,i);
can_chan_dev[i].mb15data0 = M523X_CAN_MBUF15_BYTE0(IPS_BASE,i);
can_chan_dev[i].mb15data1 = M523X_CAN_MBUF15_BYTE1(IPS_BASE,i);
can_chan_dev[i].mb15data2 = M523X_CAN_MBUF15_BYTE2(IPS_BASE,i);
can_chan_dev[i].mb15data3 = M523X_CAN_MBUF15_BYTE3(IPS_BASE,i);
can_chan_dev[i].mb15data4 = M523X_CAN_MBUF15_BYTE4(IPS_BASE,i);
can_chan_dev[i].mb15data5 = M523X_CAN_MBUF15_BYTE5(IPS_BASE,i);
can_chan_dev[i].mb15data6 = M523X_CAN_MBUF15_BYTE6(IPS_BASE,i);
can_chan_dev[i].mb15data7 = M523X_CAN_MBUF15_BYTE7(IPS_BASE,i);
InitCan(&can_chan_dev[i]);
}
}
/******************************************************************************
*
* InitCan - 初始化Flex_can 在默认状态下
*初始化CAN设备结构寄存器地址,并调用Initcan函数对CAN寄存器进行初始化
*
*返回:无
*
*参数:无
******************************************************************************/
LOCAL STATUS InitCan(Can_DEV *pcan_chan)
{
register int i;
int oldlevel;
i = 0;
oldlevel = intLock();
//打开can,设置FRZ和HALT位,使CAN进入Freeze模式,MB数目为2
CANDEV_WRITE(pcan_chan->mcr,
MCR_MENE | MCR_FRZ | MCR_HALT | MCR_SUPV | MCR_MAXMB);
while((CANDEV_READ(pcan_chan->mcr) & MCR_FRZACK) == 0x00000000) //等待can进入Freeze模式
{
i++;
if(i >= 40000)
{
return ERROR;
}
}
/*配置S_CLK的预除因子,时钟源及时间分额数量*/
CANDEV_WRITE(pcan_chan->ctrl,
CTRL_PRESDIV | CTRL_RJW | CTRL_PSEG1 | CTRL_PSEG2 | CTRL_CLK_SRC | CTRL_SMP | CTRL_PROPSEG);
/*初始化MB0作为发送缓冲区,MB1作为接收缓冲区*/
CANDEV_WRITE(pcan_chan->txcode,
TX_NOTENABLE | DEFAULT_LENGTH);
CANDEV_WRITE(pcan_chan->rxcode,
RX_NOTENABLE | DEFAULT_LENGTH);
/*初始化发送缓冲区及接收缓冲区ID*/
CANDEV_WRITE(pcan_chan->txID,(pcan_chan->TxID)<<18);
CANDEV_WRITE(pcan_chan->rxID,(pcan_chan->RxID)<<18);
/*清除发送缓冲区数据*/
CANDEV_WRITE(pcan_chan->txdata0,0x00);
CANDEV_WRITE(pcan_chan->txdata1,0x00);
CANDEV_WRITE(pcan_chan->txdata2,0x00);
CANDEV_WRITE(pcan_chan->txdata3,0x00);
CANDEV_WRITE(pcan_chan->txdata4,0x00);
CANDEV_WRITE(pcan_chan->txdata5,0x00);
CANDEV_WRITE(pcan_chan->txdata6,0x00);
CANDEV_WRITE(pcan_chan->txdata7,0x00);
/*清除接收缓冲区数据*/
CANDEV_WRITE(pcan_chan->rxdata0,0x00);
CANDEV_WRITE(pcan_chan->rxdata1,0x00);
CANDEV_WRITE(pcan_chan->rxdata2,0x00);
CANDEV_WRITE(pcan_chan->rxdata3,0x00);
CANDEV_WRITE(pcan_chan->rxdata4,0x00);
CANDEV_WRITE(pcan_chan->rxdata5,0x00);
CANDEV_WRITE(pcan_chan->rxdata6,0x00);
CANDEV_WRITE(pcan_chan->rxdata7,0x00);
/*不用的缓冲区2~15全部作为接受缓冲区,并且不使能和清零缓冲区的数据*/
/*MB2*/
CANDEV_WRITE(pcan_chan->mb2code,
TX_NOTENABLE | 0);
CANDEV_WRITE(pcan_chan->mb2ID,0);
CANDEV_WRITE(pcan_chan->mb2data0,0x00);
CANDEV_WRITE(pcan_chan->mb2data1,0x00);
CANDEV_WRITE(pcan_chan->mb2data2,0x00);
CANDEV_WRITE(pcan_chan->mb2data3,0x00);
CANDEV_WRITE(pcan_chan->mb2data4,0x00);
CANDEV_WRITE(pcan_chan->mb2data5,0x00);
CANDEV_WRITE(pcan_chan->mb2data6,0x00);
CANDEV_WRITE(pcan_chan->mb2data7,0x00);
/*MB3*/
CANDEV_WRITE(pcan_chan->mb3code,TX_NOTENABLE | 0);
CANDEV_WRITE(pcan_chan->mb3ID,0);
CANDEV_WRITE(pcan_chan->mb3data0,0x00);
CANDEV_WRITE(pcan_chan->mb3data1,0x00);
CANDEV_WRITE(pcan_chan->mb3data2,0x00);
CANDEV_WRITE(pcan_chan->mb3data3,0x00);
CANDEV_WRITE(pcan_chan->mb3data4,0x00);
CANDEV_WRITE(pcan_chan->mb3data5,0x00);
CANDEV_WRITE(pcan_chan->mb3data6,0x00);
CANDEV_WRITE(pcan_chan->mb3data7,0x00);
/*MB4*/
CANDEV_WRITE(pcan_chan->mb4code,TX_NOTENABLE | 0);
CANDEV_WRITE(pcan_chan->mb4ID,0);
CANDEV_WRITE(pcan_chan->mb4data0,0x00);
CANDEV_WRITE(pcan_chan->mb4data1,0x00);
CANDEV_WRITE(pcan_chan->mb4data2,0x00);
CANDEV_WRITE(pcan_chan->mb4data3,0x00);
CANDEV_WRITE(pcan_chan->mb4data4,0x00);
CANDEV_WRITE(pcan_chan->mb4data5,0x00);
CANDEV_WRITE(pcan_chan->mb4data6,0x00);
CANDEV_WRITE(pcan_chan->mb4data7,0x00);
/*MB5*/
CANDEV_WRITE(pcan_chan->mb5code,TX_NOTENABLE | 0);
CANDEV_WRITE(pcan_chan->mb5ID,0);
CANDEV_WRITE(pcan_chan->mb5data0,0x00);
CANDEV_WRITE(pcan_chan->mb5data1,0x00);
CANDEV_WRITE(pcan_chan->mb5data2,0x00);
CANDEV_WRITE(pcan_chan->mb5data3,0x00);
CANDEV_WRITE(pcan_chan->mb5data4,0x00);
CANDEV_WRITE(pcan_chan->mb5data5,0x00);
CANDEV_WRITE(pcan_chan->mb5data6,0x00);
CANDEV_WRITE(pcan_chan->mb5data7,0x00);
/*MB8*/
CANDEV_WRITE(pcan_chan->mb6code,TX_NOTENABLE | 0);
CANDEV_WRITE(pcan_chan->mb6ID,0);
CANDEV_WRITE(pcan_chan->mb6data0,0x00);
CANDEV_WRITE(pcan_chan->mb6data1,0x00);
CANDEV_WRITE(pcan_chan->mb6data2,0x00);
CANDEV_WRITE(pcan_chan->mb6data3,0x00);
CANDEV_WRITE(pcan_chan->mb6data4,0x00);
CANDEV_WRITE(pcan_chan->mb6data5,0x00);
CANDEV_WRITE(pcan_chan->mb6data6,0x00);
CANDEV_WRITE(pcan_chan->mb6data7,0x00);
/*MB7*/
CANDEV_WRITE(pcan_chan->mb7code,TX_NOTENABLE | 0);
CANDEV_WRITE(pcan_chan->mb7ID,0);
CANDEV_WRITE(pcan_chan->mb7data0,0x00);
CANDEV_WRITE(pcan_chan->mb7data1,0x00);
CANDEV_WRITE(pcan_chan->mb7data2,0x00);
CANDEV_WRITE(pcan_chan->mb7data3,0x00);
CANDEV_WRITE(pcan_chan->mb7data4,0x00);
CANDEV_WRITE(pcan_chan->mb7data5,0x00);
CANDEV_WRITE(pcan_chan->mb7data6,0x00);
CANDEV_WRITE(pcan_chan->mb7data7,0x00);
/*MB8*/
CANDEV_WRITE(pcan_chan->mb8code,TX_NOTENABLE | 0);
CANDEV_WRITE(pcan_chan->mb8ID,0);
CANDEV_WRITE(pcan_chan->mb8data0,0x00);
CANDEV_WRITE(pcan_chan->mb8data1,0x00);
CANDEV_WRITE(pcan_chan->mb8data2,0x00);
CANDEV_WRITE(pcan_chan->mb8data3,0x00);
CANDEV_WRITE(pcan_chan->mb8data4,0x00);
CANDEV_WRITE(pcan_chan->mb8data5,0x00);
CANDEV_WRITE(pcan_chan->mb8data6,0x00);
CANDEV_WRITE(pcan_chan->mb8data7,0x00);
/*MB9*/
CANDEV_WRITE(pcan_chan->mb9code,TX_NOTENABLE | 0);
CANDEV_WRITE(pcan_chan->mb9ID,0);
CANDEV_WRITE(pcan_chan->mb9data0,0x00);
CANDEV_WRITE(pcan_chan->mb9data1,0x00);
CANDEV_WRITE(pcan_chan->mb9data2,0x00);
CANDEV_WRITE(pcan_chan->mb9data3,0x00);
CANDEV_WRITE(pcan_chan->mb9data4,0x00);
CANDEV_WRITE(pcan_chan->mb9data5,0x00);
CANDEV_WRITE(pcan_chan->mb9data6,0x00);
CANDEV_WRITE(pcan_chan->mb9data7,0x00);
/*MB10*/
CANDEV_WRITE(pcan_chan->mb10code,TX_NOTENABLE | 0);
CANDEV_WRITE(pcan_chan->mb10ID,0);
CANDEV_WRITE(pcan_chan->mb10data0,0x00);
CANDEV_WRITE(pcan_chan->mb10data1,0x00);
CANDEV_WRITE(pcan_chan->mb10data2,0x00);
CANDEV_WRITE(pcan_chan->mb10data3,0x00);
CANDEV_WRITE(pcan_chan->mb10data4,0x00);
CANDEV_WRITE(pcan_chan->mb10data5,0x00);
CANDEV_WRITE(pcan_chan->mb10data6,0x00);
CANDEV_WRITE(pcan_chan->mb10data7,0x00);
/*MB11*/
CANDEV_WRITE(pcan_chan->mb11code,TX_NOTENABLE | 0);
CANDEV_WRITE(pcan_chan->mb11ID,0);
CANDEV_WRITE(pcan_chan->mb11data0,0x00);
CANDEV_WRITE(pcan_chan->mb11data1,0x00);
CANDEV_WRITE(pcan_chan->mb11data2,0x00);
CANDEV_WRITE(pcan_chan->mb11data3,0x00);
CANDEV_WRITE(pcan_chan->mb11data4,0x00);
CANDEV_WRITE(pcan_chan->mb11data5,0x00);
CANDEV_WRITE(pcan_chan->mb11data6,0x00);
CANDEV_WRITE(pcan_chan->mb11data7,0x00);
/*MB12*/
CANDEV_WRITE(pcan_chan->mb12code,TX_NOTENABLE | 0);
CANDEV_WRITE(pcan_chan->mb12ID,0);
CANDEV_WRITE(pcan_chan->mb12data0,0x00);
CANDEV_WRITE(pcan_chan->mb12data1,0x00);
CANDEV_WRITE(pcan_chan->mb12data2,0x00);
CANDEV_WRITE(pcan_chan->mb12data3,0x00);
CANDEV_WRITE(pcan_chan->mb12data4,0x00);
CANDEV_WRITE(pcan_chan->mb12data5,0x00);
CANDEV_WRITE(pcan_chan->mb12data6,0x00);
CANDEV_WRITE(pcan_chan->mb12data7,0x00);
/*MB13*/
CANDEV_WRITE(pcan_chan->mb13code,TX_NOTENABLE | 0);
CANDEV_WRITE(pcan_chan->mb13ID,0);
CANDEV_WRITE(pcan_chan->mb13data0,0x00);
CANDEV_WRITE(pcan_chan->mb13data1,0x00);
CANDEV_WRITE(pcan_chan->mb13data2,0x00);
CANDEV_WRITE(pcan_chan->mb13data3,0x00);
CANDEV_WRITE(pcan_chan->mb13data4,0x00);
CANDEV_WRITE(pcan_chan->mb13data5,0x00);
CANDEV_WRITE(pcan_chan->mb13data6,0x00);
CANDEV_WRITE(pcan_chan->mb13data7,0x00);
/*MB14*/
CANDEV_WRITE(pcan_chan->mb14code,TX_NOTENABLE | 0);
CANDEV_WRITE(pcan_chan->mb14ID,0);
CANDEV_WRITE(pcan_chan->mb14data0,0x00);
CANDEV_WRITE(pcan_chan->mb14data1,0x00);
CANDEV_WRITE(pcan_chan->mb14data2,0x00);
CANDEV_WRITE(pcan_chan->mb14data3,0x00);
CANDEV_WRITE(pcan_chan->mb14data4,0x00);
CANDEV_WRITE(pcan_chan->mb14data5,0x00);
CANDEV_WRITE(pcan_chan->mb14data6,0x00);
CANDEV_WRITE(pcan_chan->mb14data7,0x00);
/*MB15*/
CANDEV_WRITE(pcan_chan->mb15code,TX_NOTENABLE | 0);
CANDEV_WRITE(pcan_chan->mb15ID,0);
CANDEV_WRITE(pcan_chan->mb15data0,0x00);
CANDEV_WRITE(pcan_chan->mb15data1,0x00);
CANDEV_WRITE(pcan_chan->mb15data2,0x00);
CANDEV_WRITE(pcan_chan->mb15data3,0x00);
CANDEV_WRITE(pcan_chan->mb15data4,0x00);
CANDEV_WRITE(pcan_chan->mb15data5,0x00);
CANDEV_WRITE(pcan_chan->mb15data6,0x00);
CANDEV_WRITE(pcan_chan->mb15data7,0x00);
/*设置ID屏蔽寄存器,检查所有的标准格式的ID位*/
CANDEV_WRITE(pcan_chan->rxgmask,0x1FFFFFFF);
/*屏蔽除MBO和MB1外的所有中断*/
CANDEV_WRITE(pcan_chan->imask,0x0003);
/*清除中断标志*/
CANDEV_WRITE(pcan_chan->iflag,0xFFFF);
/*退出FREEZE模式,退出管理模式*/
CANDEV_WRITE(pcan_chan->mcr,
MCR_MENE | MCR_MAXMB);
intUnlock (oldlevel);
/*创建发送接收信号量*/
printf("Create Sem...\n\r");
pcan_chan->tx_semSync = semBCreate(SEM_Q_FIFO,SEM_FULL); /*发送信号量初始状态为满*/
if(pcan_chan->tx_semSync == NULL)
{
printf("tx_semSync creat error\n");
return ERROR;
}
pcan_chan->rx_semSync = semBCreate(SEM_Q_FIFO,SEM_EMPTY);/*接收信号量初始状态为空*/
if(pcan_chan->rx_semSync == NULL)
{
printf("rx_semSync creat error\n");
return ERROR;
}
printf("Done.\n\r");
return OK;
}
/******************************************************************************
*
* WriteByte - 写字节到Flex_can的信息缓冲区中
*
*返回:成功返回OK,否则返回ERROR
*
*参数:
pcan_chan -- 要写入字节的can设备
byte -- 要写入的字节
num -- 该字节在信息缓冲区中的位置
******************************************************************************/
LOCAL STATUS WriteByte(Can_DEV *pcan_chan,UCHAR byte,int num)
{
if(num >= 8) return ERROR;
switch (num)
{
case 0:
CANDEV_WRITE(pcan_chan->txdata0,byte);
break;
case 1:
CANDEV_WRITE(pcan_chan->txdata1,byte);
break;
case 2:
CANDEV_WRITE(pcan_chan->txdata2,byte);
break;
case 3:
CANDEV_WRITE(pcan_chan->txdata3,byte);
break;
case 4:
CANDEV_WRITE(pcan_chan->txdata4,byte);
break;
case 5:
CANDEV_WRITE(pcan_chan->txdata5,byte);
break;
case 6:
CANDEV_WRITE(pcan_chan->txdata6,byte);
break;
case 7:
CANDEV_WRITE(pcan_chan->txdata7,byte);
break;
default:
return ERROR;
}
return OK;
}
/******************************************************************************
*
* Can0TxInterrupt - Flex_can0模块发送中断函数,调用相应的中断例程
*
*返回:无
*
*参数:无
******************************************************************************/
void Can0TxInterrupt (void)
{
UINT16 intStatus;
//logMsg("#can0 Tx Int!T#", 1, 2, 3, 4, 5, 6);
intStatus = CANDEV_READ(can_chan_dev[0].iflag);/*读中断状态标志*/
if((intStatus & 0x0001) == 0x0001)
{
CanTxInterrupt(&can_chan_dev[0]);
}
else
{
logMsg("#can0 Tx vacant Int!T#", 1, 2, 3, 4, 5, 6);
}
/*
if(intStatus & CAN0_TX_INT_STATUS)
{
CanTxInterrupt(&can_chan_dev[0]);
}
if(intStatus & CAN0_RX_INT_STATUS)
{
CanRxInterrupt(&can_chan_dev[0]);
}
*/
CANDEV_WRITE(can_chan_dev[0].iflag,0x0001);/*清除中断状态标志*/
}
/******************************************************************************
*
* Can0RxInterrupt - Flex_can0模块接收中断函数,调用相应的中断例程
*
*返回:无
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -