微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32的can现场总线实验心得分享

STM32的can现场总线实验心得分享

时间:11-13 来源:互联网 点击:

for(i=0;i

TxMessage.Data = data;

*/

TxMessage.DLC= 1; //设定待传输消息的帧长度

TxMessage.Data[0] = data;// 包含了待传输数据

TransmitMailbox = CAN_Transmit(&TxMessage);//开始一个消息的传输

i = 0;

while((CAN_TransmitStatus(TransmitMailbox) != CANTXOK) && (i != 0xFF))//通过检查CANTXOK位来确认发送是否成功

{

i++;

}

return (TestStatus)ret;

}

CAN_Transmit()函数的操作包括:

1. [选择一个空的发送邮箱]

2. [设置Id]*

3. [设置DLC待传输消息的帧长度]

4. [请求发送]

请求发送语句:

CAN->sTxMailBox[TransmitMailbox].TIR |= TMIDxR_TXRQ;//对CAN_TIxR寄存器的TXRQ位置1,来请求发送

发送方面搞定了,但接收方面呢?好像在主程序里看不到有接收的语句。立刻向师兄求救。

原来是用来中断方式来接收数据,原来它和串口一样可以有两种方式接收数据,一种是中断方式一种是轮询方式,若采用轮询方式则要调用主函数的CAN_Polling(void)函数。

接着又遇到一个问题,为什么中断函数CAN_Interrupt(void)的最后要关中断呢?

因为一旦往FIFO存入1个报文,硬件就会更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位为1,那么就会产生一个中断请求。所以中断函数执行完后就要清除FMPIE标志位。这时我才回想起来,原来我对CAN的理解还不够,对程序设计的初衷不够明确,于是我重新看了一遍CAN的工作原理,这时后我发现比以前容易理解了,可能是因为看了程序以后知道了大概的流程,然后看资料就有了针对性。

发送者以广播的形式把报文发送给所有的接收者(注:不是一对一通信,而是多机通信)节点在接收报文时-根据标识符的值-决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。一旦往FIFO存入1个报文,硬件就会更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位为1,那么就会产生一个中断请求。所以中断函数执行完后就要清除FMPIE标志位。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top