发新帖我要提问
123
返回列表
打印
[应用相关]

STM32的can总线实验心得

[复制链接]
楼主: hehhehee
手机看帖
扫描二维码
随时随地手机跟帖
41
hehhehee|  楼主 | 2021-7-24 23:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览

使用特权

评论回复
42
hehhehee|  楼主 | 2021-7-24 23:03 | 只看该作者
在初始化完成后,软件应该让硬件进入正常模式,以便正常接收和发送报文。软件可以通过对 CAN_MCR 寄存器的INRQ位清 '0',来请求从初始化模式进入正常模式,然后要等待硬件对 CAN_MSR 寄存器的 INAK 位置 '1' 的确认。在跟 CAN 总线取得同步,即在 CANRX 引脚上监测到 11 个连续的隐性位 (等效于总线空闲) 后,bxCAN 才能正常接收和发送报文。

使用特权

评论回复
43
hehhehee|  楼主 | 2021-7-24 23:04 | 只看该作者
不需要在初始化模式下进行过滤器初值的设置,但必须在它处在非激活状态下完成 (相应的 FACT 位为 '0' ) 。而过滤器的位宽和模式的设置,则必须在初始化模式中进入正常模式前完成。

使用特权

评论回复
44
hehhehee|  楼主 | 2021-7-24 23:06 | 只看该作者
准备工作做完我们需要设置 CAN 通讯部份软件。

使用特权

评论回复
45
hehhehee|  楼主 | 2021-7-24 23:08 | 只看该作者
我们把 TestStatus CAN_Polling(void) 函数和 TestStatus CAN_Interrupt(void) 函数中的 LoopBack 模式修改为 Normal 模式.



//CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;



   CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;



   接下来我们就可以做实验了. 但是由于 RealView MDK 的 CAN 模块没有办法接收, 所以我们只做发送的例子.

使用特权

评论回复
46
hehhehee|  楼主 | 2021-7-24 23:09 | 只看该作者
我们的例子中分别发送两帧数据:


(1) TestStatus CAN_Polling(void) 查询发送

第一帧数据为:   ID 为 0x11, 数据为 8 个字节的一个数据包.

使用特权

评论回复
47
hehhehee|  楼主 | 2021-7-24 23:09 | 只看该作者
TxMessage.StdId=0x11;



   TxMessage.RTR=CAN_RTR_DATA;



   TxMessage.IDE=CAN_ID_STD;



   TxMessage.DLC=8;



   TxMessage.Data[0]=0x01;



   TxMessage.Data[1]=0x02;



   TxMessage.Data[2]=0x03;



   TxMessage.Data[3]=0x04;



   TxMessage.Data[4]=0x05;



   TxMessage.Data[5]=0x06;



   TxMessage.Data[6]=0x07;



   TxMessage.Data[7]=0x08;



使用特权

评论回复
48
hehhehee|  楼主 | 2021-7-24 23:16 | 只看该作者
(2) TestStatus CAN_Interrupt(void) 中断发送


第二帧数据为:ID 为 0x1234, 数据为 8 个字节的一个数据包.



   TxMessage.StdId=0x12;



   TxMessage.ExtId=0x34;



   TxMessage.IDE=CAN_ID_EXT;



   TxMessage.RTR=CAN_RTR_DATA;



   TxMessage.DLC=8;



   TxMessage.Data[0]=0x11;



   TxMessage.Data[1]=0x22;



   TxMessage.Data[2]=0x33;



   TxMessage.Data[3]=0x44;



   TxMessage.Data[4]=0x55;



   TxMessage.Data[5]=0x66;



   TxMessage.Data[6]=0x77;



   TxMessage.Data[7]=0x88;



   CAN_Transmit(&TxMessage);

使用特权

评论回复
49
hehhehee|  楼主 | 2021-7-24 23:17 | 只看该作者
在主函数中初始化之后加上这两句发送函数:



   /* CAN transmit at 100Kb/s and receive by polling in Normal mode*/



   CAN_Polling();



   while(i++ < 1000);



   /* CAN transmit at 500Kb/s and receive by interrupt in Normal mode*/



   CAN_Interrupt();

使用特权

评论回复
50
hehhehee|  楼主 | 2021-7-24 23:22 | 只看该作者
程序改完了, 我们需要编译通过后, 点软件仿真.

使用特权

评论回复
51
hehhehee|  楼主 | 2021-7-24 23:23 | 只看该作者


CAN 软件仿真模拟器

调用出来.

使用特权

评论回复
52
hehhehee|  楼主 | 2021-7-24 23:24 | 只看该作者
接下来我们全速运行到 while(1) 就可以看到结果了.

使用特权

评论回复
53
hehhehee|  楼主 | 2021-7-24 23:26 | 只看该作者
看到结果了.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则