DEVKIT-mpc5744p配置can通信
DEVKIT-mpc5744p配置can通信
·
DEVKIT-mpc5744p配置can通信
软件:S32 Design Studio for Power Architecture Version 2.1
新建工程,配置与生成代码
本文工程下载
can协议
- CAN: 控制器局域网络, 异步通信, CAN_H & CAN_L构成一组差分信号线
- 闭环总线网络: (ISO11898)标准高速, 短距离闭环网络, 最长40m, 最快1Mbps, 两端有120
Ω
\Omega
Ω电阻
- 开环总线网络: (ISO11519-2)标准低速, 长距离开环网络, 最长1km, 最快125kbps, 两线独立不闭环, 各串2.2
k
Ω
k\Omega
kΩ电阻
- 不对节点编码, 对内容编码, 可挂载多节点, 负载足够理论上数量不限, 可通过中继器增强负载
- 节点: CAN控制器+CAN收发器
STM32的CAN片上外设即通讯节点的控制器,需要外接收发器(TJA1050) - 差分信号: 逻辑1(隐形电平), 逻辑0(显性电平)
- CAN报文: 对数据, 操作命令, 同步信号进行打包
- 数据帧: 传输起始标签+片选标签+控制标签+原始数据段+CRC校验标签+应答标签+传输结束标签
- 数据帧: 节点向外传送数据
- 遥控帧: 向远端节点请求数据
- 错误帧: 向远端节点通知校验错误, 请求重发上一个数据
- 过载帧: 通知远端节点:本节点尚未准备好接收
- 帧间隔: 将数据帧及遥控帧与前面的帧分离开
- 数据帧结构
- 帧起始: SOF段, 1位,
- 仲裁: 有两个报文要发送, 总线根据哪个数据包能被传输, 发送报文时先出现隐形电平则失去对总线占有权, 仲裁段值越小, 优先级越高
- 数据帧: 传输起始标签+片选标签+控制标签+原始数据段+CRC校验标签+应答标签+传输结束标签
- 模式
- 正常模式: 可收发
- 静默模式: 只能向总线发送隐性位, 监测总线数据
- 回环模式: 输出->输入 & 总线, 不能接收总线, 用于自检
- 回环静默模式: 自我检查, 不干扰总线
配置
-
在
component library
中双击添加can pal
模块
-
再在
components
中双击这个模块,进入配置界面,完成配置
3. 在pins中初始化can的tx和rx pins (容易忘记这一步!)
-
ctrl+s
保存, 生成代码
-
添加发送邮箱和接受邮箱、报文id
#define TX_MAILBOX (1UL) #define TX_MSG_ID (0x300) #define RX_MAILBOX (0UL) #define RX_MSG_ID (0x301)
-
可以开启定时器中断, 中断发送, 也可以在while延时循环发送
CAN_Init(&can_pal1_instance, &can_pal1_Config0); // 初始化
uint8_t CanCount = 0; // can计数 uint8_t SendBuff[8] = {1,2,3,4,5,6,7,8}; // 发送内容 uint8_t ReceiveCount = 0; // 接收计数, 可忽略 /*** 发送 ***/ SendBuff[7] = CanCount; // 末位自加1 can_buff_config_t buffCfg = { .enableFD = false, .enableBRS = false, .fdPadding = 0U, .idType = CAN_MSG_ID_STD, .isRemote = false }; /* Configure TX buffer with index TX_MAILBOX*/ CAN_ConfigTxBuff(&can_pal1_instance, TX_MAILBOX, &buffCfg); /* Prepare message to be sent */ can_message_t message = { .cs = 0U, .id = 0x300, // 发送id, 即TX_MSG_ID .data[0] = SendBuff[0], .data[1] = SendBuff[1], .data[2] = SendBuff[2], .data[3] = SendBuff[3], .data[4] = SendBuff[4], .data[5] = SendBuff[5], .data[6] = SendBuff[6], .data[7] = SendBuff[7], .length = 8U // 发送数据长度 }; CanCount++; // 末位自加1, 可不加 /* Send the information via CAN */ CAN_Send(&can_pal1_instance, TX_MAILBOX, &message); // 发送
-
在
while
中循环接收while(1) { can_message_t recvMsg; /* Start receiving data in RX_MAILBOX. */ CAN_Receive(&can_pal1_instance, RX_MAILBOX, &recvMsg); /* Wait until the previous FlexCAN receive is completed */ while(CAN_GetTransferStatus(&can_pal1_instance, RX_MAILBOX) == STATUS_BUSY); /* Check the received message ID and payload */ if(recvMsg.id == 0x301) { PINS_DRV_TogglePins(PTC,(1 << 13)); SendBuff[ReceiveCount] = recvMsg.data[0]; ReceiveCount++; if(ReceiveCount > 6) { ReceiveCount = 0; } } }
-
编译, debug
FlexCan
#define TX_MAILBOX (1UL)
#define TX_MSG_ID (1UL)
void SendCANData(uint32_t mailbox, uint32_t messageId, uint8_t * data, uint32_t len)
{
/* Set information about the data to be sent
* - 1 byte in length
* - Standard message ID
* - Bit rate switch enabled to use a different bitrate for the data segment
* - Flexible data rate enabled
* - Use zeros for FD padding
*/
flexcan_data_info_t dataInfo =
{
.data_length = len,
.msg_id_type = FLEXCAN_MSG_ID_STD
};
/* Configure TX message buffer with index TX_MSG_ID and TX_MAILBOX*/
FLEXCAN_DRV_ConfigTxMb(INST_CANCOM1, mailbox, &dataInfo, messageId);
/* Execute send non-blocking */
FLEXCAN_DRV_Send(INST_CANCOM1, mailbox, &dataInfo, messageId, data);
}
FLEXCAN_DRV_Init(INST_CANCOM1, &canCom1_State, &canCom1_InitConfig0);
SendCANData(TX_MAILBOX, TX_MSG_ID, &iuiu, 1UL);
更多推荐
已为社区贡献6条内容
所有评论(0)