CAN的收发函数

一。发送

1,基础知识

2.发送函数

3.发送函数F1开发板和F4开发板的区别(左边是F1,右边是F4

注意:有不同的:在标识符中,F1开发板用的是宏定义,F4开发板用的是数值,宏定义和数值是一样的。

4.STM32F1开发板的发送函数注意事项:

        1.Msg数据指针,也是我们要发送的内容,也就是我们要发送的缓冲区的首地址

        2.len发送的数据长度0~8.

        3.发送格式:以0x12这种12位的固定ID格式发送

        4.mbox发送邮箱是通过后面的CAN_Transmit进行查询才能知道我们用的邮箱是哪一个

        5.CanTxMsg   TxMessage这个是定义的结构体

        6.StdId是标准ID      ExtId是扩展ID   

        7.IDE是标准帧

        8.  TxMessage.Data一个数组

       

        9.  while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;

                   这句话意思是

              根据查询状态寄存器,是不是发送失败了,发送失败的话,需要等待一段时间,

              如果还是失败,就返回1,失败,返回0,发送成功。


二。接收

1,基础知识

注意:报文FIFO具有锁定功能(由CAN_MCR,RFLM位控制),锁定后,新数据将丢弃,

          不锁定则新数据将替代老数据

2,接收函数

三,STM32的CAN位时序

  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于GD32F103VET6芯片的CAN总线收发函数的样例代码: 首先需要在代码中包含头文件`gd32f10x_can.h`和`gd32f10x.h`: ``` #include "gd32f10x_can.h" #include "gd32f10x.h" ``` 然后需要进行CAN总线的初始化,可以参考如下代码: ``` /* CAN1 GPIOs configuration **************************************************/ /* enable CAN1 GPIO clocks */ rcu_periph_clock_enable(RCU_GPIOA); /* configure CAN1 GPIOs */ gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11); gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12); /* CAN1 Periph clock enable */ rcu_periph_clock_enable(RCU_CAN1); /* CAN1 register init */ can_deinit(CAN1); /* CAN1 cell init */ can_struct_para_init(&can_parameter); can_parameter.can_mode = CAN_MODE_NORMAL; can_parameter.can_sjw = CAN_SJW_1TQ; can_parameter.can_bs1 = CAN_BS1_9TQ; can_parameter.can_bs2 = CAN_BS2_8TQ; can_parameter.can_prescaler = 3; can_parameter.can_ttc = DISABLE; can_parameter.can_abom = ENABLE; can_parameter.can_awu = DISABLE; can_parameter.can_ard = DISABLE; can_parameter.can_rflm = DISABLE; can_parameter.can_nart = ENABLE; can_parameter.can_txfp = DISABLE; can_init(CAN1, &can_parameter); ``` 接下来是CAN总线的发送函数,可以参考如下代码: ``` /* CAN1 send data */ uint8_t can1_send_data(uint32_t id, uint8_t* data, uint8_t len) { can_trasnmit_message_struct transmit_message; uint8_t mbox; transmit_message.tx_sfid = id; transmit_message.tx_efid = 0x00; transmit_message.tx_ft = CAN_FT_DATA; transmit_message.tx_ff = CAN_FF_STANDARD; transmit_message.tx_dlen = len; memcpy(transmit_message.tx_data, data, len); mbox = can_message_transmit(CAN1, &transmit_message); while((can_transmit_status(CAN1, mbox) == CAN_TX_STATUS_PENDING)); if(can_transmit_status(CAN1, mbox) == CAN_TX_STATUS_SUCCESS) { return 0; } else { return 1; } } ``` 最后是CAN总线的接收函数,可以参考如下代码: ``` /* CAN1 receive data */ uint8_t can1_receive_data(uint32_t* id, uint8_t* data, uint8_t* len) { can_receive_message_struct receive_message; if(can_message_receive(CAN1, CAN_FIFO0, &receive_message) == SUCCESS) { *id = receive_message.rx_sfid; *len = receive_message.rx_dlen; memcpy(data, receive_message.rx_data, *len); return 0; } else { return 1; } } ``` 需要注意的是,以上代码仅供参考,具体实现过程中需要根据实际情况进行调整。同时,在使用CAN总线时需要注意相关的硬件连接、波特率设置等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值