TestStatusCAN_TxData(chardata)
{
CanTxMsgTxMessage; u32i=0;
u8TransmitMailbox=0;
TxMessage.StdId=0x00;// 设定标准标识符 TxMessage.ExtId=0x1234;// 设定扩展标识符
TxMessage.lDE=CA N」D_EXT;〃设定消息标识符的类型 TxMessage. RTR=CAN_RTR_DATA设定待传输消息的帧类型 TxMessage.DLC=1;// 设定待传输消息的帧长度 TxMessage.Data[0]=data;// 包含了待传输数据
TransmitMailbox=CAN_Transmit(&TxMessage);// 开始一个消息的传输while((CAN_TransmitStatus(TransmitMailbox)!= 查CANTXO位来确认发送是否成功 { i++; } return(TestStatus)ret; } CAN_Transmit ()函数的操作包括: 1. [ 选择一个空的发送邮箱 ] 2. [ 设置 ld]* 3. [设置DLC待传输消息的帧长度] 通过检 i=0; 4. [ 请求发送 ] 请求发送语句: CAN->sTxMailBox[TransmitMailbox].TIR|=TMIDxR_TXRQ;// 对 CAN_TIxR 寄存 器的 TXRQM置1,来请求发送 发送方面搞定了,但接收方面呢?好像在主程序里看不到 有接收的语句。 原来是用中断方式来接收数据,原来它和串口一样可以有两种方式接收数据, 一种是中断一种是轮询, 若采用轮询方式则要调用主函数的 CAN_Polling(void) 函数。 接着又遇到一个问题,为什么中断函数 CAN_Interrupt(void) 的最后要关中断 呢? CAN总线是多主机通信的,不是点对点或者一主多从模式 ,系多主机的情况下, 否则会使很多主机无法进行通信 , 从而导致致命的后果 ,CAN 总线一般用于很实 时的情况。 发送者以广播的形式把报文发送给所有的接收者(注:不是一对一通信,而是 多机通信)节点在接收报文时根据标识符的值决定软件是否需要该报文;如果 需要,就拷贝到SRAh里;如果不需要,报文就被丢弃且无需软件的干预。一旦 往FIFO存入1个报文,硬件就会更新 FMP[1:0]位,并且如果CAN_IEF寄存器 的FMPIE位为1,那么就会产生一个中断请求。中断函数执行完后关中断是要 让出总线周期让其它的主机使用。