- UID
- 1029342
- 性别
- 男
|
在初始化完成后,软件应该让硬件进入正常模式,以便正常接收和发送报文。软件可以通过对 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) 就可以看到结果了. |
|