微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > SAM4E单片机之旅——19、CAN间通信

SAM4E单片机之旅——19、CAN间通信

时间:04-19 来源:互联网 点击:

数字:

int num;

scanf("%d", &num);

通过信箱发送数据。

假设int为4字节,则通过CAN_MDL即可表示所需信息。发送时,在确定信箱可用后,需要指定好信息ID。然后向CAN_MCR写入信息长度(用byte表示),同时写入MTCR位以开始发送操作。最后,在发送完成后,CAN_MSR的MRDY位重新置位。

// 等待信箱可用

while(!(TX_MB->CAN_MSR & CAN_MSR_MRDY));

TX_MB->CAN_MID = CAN_MID_MIDvA(CAN_COMM_ID); // ID

TX_MB->CAN_MDL = num; // 低4字节数据

TX_MB->CAN_MCR = CAN_MCR_MDLC(4) // 数据长度

| CAN_MCR_MTCR; // 开始尝试发送

printf("-I- Sending message from TX mailbox...\r\n");

// 等待发送完成

while(!(TX_MB->CAN_MSR & CAN_MSR_MRDY));

通过信箱接收数据。

通过查询CAN_MSR的MRDY位可以确定是否接收到了数据,然后在CAN_MSR的MDLC字段可以确定信息长度。在完成数据接收后,需要向CAN_MCR写入MTCR字段以完成本次接收,从而开始下一次信息接收工作。

// 等待信息接收完成

while(!(RX_MB->CAN_MSR & CAN_MSR_MRDY));

// 检查信息长度

const int rec_len =

(RX_MB->CAN_MSR & CAN_MSR_MDLC_Msk) >> CAN_MSR_MDLC_Pos;

if (rec_len == 4) {

// 读取信息并打印

printf("-I- Data read from RX mailbox: %d \r\n",

(int)RX_MB->CAN_MDL);

}

// 开始下一次接收

RX_MB->CAN_MCR = CAN_MCR_MTCR;

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

网站地图

Top