首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32的can总线实验心得(5)

STM32的can总线实验心得(5)

在初始化完成后,软件应该让硬件进入正常模式,以便正常接收和发送报文。软件可以通过对 CAN_MCR 寄存器的INRQ位清 '0',来请求从初始化模式进入正常模式,然后要等待硬件对 CAN_MSR 寄存器的 INAK 位置 '1' 的确认。在跟 CAN 总线取得同步,即在 CANRX 引脚上监测到 11 个连续的隐性位 (等效于总线空闲) 后,bxCAN 才能正常接收和发送报文。
不需要在初始化模式下进行过滤器初值的设置,但必须在它处在非激活状态下完成 (相应的 FACT 位为 '0' ) 。而过滤器的位宽和模式的设置,则必须在初始化模式中进入正常模式前完成。

准备工作做完我们需要设置 CAN 通讯部份软件。



我们把 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 模块没有办法接收, 所以我们只做发送的例子.

我们的例子中分别发送两帧数据:

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

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

   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;


(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);

在主函数中初始化之后加上这两句发送函数:

   /* 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();

程序改完了, 我们需要编译通过后, 点软件仿真.


CAN 软件仿真模拟器
调用出来.

接下来我们全速运行到 while(1) 就可以看到结果了.
继承事业,薪火相传
返回列表