STM32F429 rtthread CAN总线

1.简介

CAN(Controller Area Network) 总线
CAN通讯并不是以时钟信号来进行同步的,它是一种异步通讯,只具有CAN_High和CAN_Low两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。
CAN物理层的形式主要分为闭环总线及开环总线网络两种,一个适合于高速通讯,一个适合于远距离通讯。CAN闭环通讯网络是一种遵循ISO11898标准的高速、短距离网络,它的总线最大长度为40m,通信速度最高为1Mbps,总线的两端各要求有一个“120欧”的电阻。来做阻抗匹配,以减少回波反射。
在这里插入图片描述
CAN开环总线网络是遵循ISO11519-2标准的低速、远距离网络,它的最大传输距离为1km,最高通讯速率为125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2千欧”的电阻
在这里插入图片描述

2.代码移植

2.1.rtconfig.h

#define RT_USING_CAN
#define BSP_USING_CAN
#define BSP_USING_CAN1

2.2.工程添加

E:\RTT\rt-thread-4.0.2-USBHID\bsp\stm32\libraries\HAL_Drivers\drv_can.c
E:\RTT\rt-thread-4.0.2-USBHID\components\drivers\can\can.c
E:\RTT\rt-thread-4.0.2-USBHID\bsp\stm32\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_can.c

2.3.打开HAL库

在这里插入图片描述

2.4.修改时钟

usb和can一起使用,usb时钟为48M,can时钟为42M或者45M
在这里插入图片描述
在这里插入图片描述

2.5.can波特率修改

drv_can.c
在这里插入图片描述
tsjw:重新同步跳跃时间单元.范围:CAN_SJW_1TQ~CAN_SJW_4TQ
tbs2:时间段2的时间单元. 范围:CAN_BS2_1TQ~CAN_BS2_8TQ;
tbs1:时间段1的时间单元. 范围:CAN_BS1_1TQ~CAN_BS1_16TQ
brp :波特率分频器.范围:1~1024; tq=(brp)*tpclk1
波特率=Fpclk1/((tbs1+tbs2+1)*brp); 其中tbs1和tbs2我们只用关注标识符上标志的序号,例如CAN_BS2_1TQ,我们就认为tbs2=1来计算即可。
Fpclk1的时钟在初始化的时候设置为42M
则波特率为:42M/((6+7+1)*6)=500Kbps

2.6.添加设备使用例程

thread_can.c
代码死活贴不上来,放弃了

3.验证

开发板can接口连接CANalyst-II,CANalyst-II的USB口接电脑,USB-CAN TOOL工具查看数据发送接收情况
在这里插入图片描述
先粗略的研究一下,可以收发数据了,以后用到在详细研究吧
代码链接:https://download.csdn.net/download/u010915068/20079981

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于STM32F429,您可以使用RT-Thread实现SPI模拟。首先,确保您已经在STM32F429上成功搭建了RT-Thread开发环境。 接下来,您需要在RT-Thread的配置文件中启用SPI设备和模拟SPI的驱动。您可以通过修改`rtconfig.h`文件来实现。找到以下几行代码并取消注释,以启用SPI和模拟SPI驱动: ```c #define RT_USING_SPI #define RT_USING_SPI1 #define RT_USING_SPI2 ... ``` 然后在您的应用程序中使用RT-Thread提供的SPI API来实现模拟SPI。以下是一个简单的示例代码: ```c #include <rtthread.h> #include <rtdevice.h> int main(void) { rt_device_t spi_dev; uint8_t tx_data[2] = {0xAA, 0xBB}; uint8_t rx_data[2] = {0}; spi_dev = rt_device_find("spi1"); // 根据实际情况修改SPI设备名称 if (spi_dev != RT_NULL) { rt_device_open(spi_dev, RT_DEVICE_OFLAG_RDWR); rt_device_control(spi_dev, RT_DEVICE_CTRL_SPI_SET_MODE, (void*)RT_SPI_MODE_0); rt_device_control(spi_dev, RT_DEVICE_CTRL_SPI_SET_BITS_PER_WORD, (void*)RT_SPI_8BITS); rt_device_write(spi_dev, 0, tx_data, 2); rt_device_read(spi_dev, 0, rx_data, 2); rt_device_close(spi_dev); } return 0; } ``` 在这个示例中,我们使用了SPI1设备,并发送了两个字节的数据,然后读取两个字节的响应。您可以根据实际情况修改设备名称、数据以及其他配置参数。 请注意,这只是一个简单的示例,您可能需要根据您的实际需求进行更多的设置和处理。另外,还要确保在RT-Thread的设备管理中正确配置了SPI设备。 希望这能帮到您!如有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值