[活动专区] 【AT-START-F407测评】+使用RTThread的soft-I2C设备接口读取传感器

[复制链接]
1996|7
 楼主| WoodData 发表于 2021-2-16 12:38 | 显示全部楼层 |阅读模式
     上次使用keil开发的I2C接口读取传感器数据 https://bbs.21ic.com/icview-3071262-1-1.html。这次试了下使用RTT-Studio开发I2C设备方式读取传感器。
在RT-Thread Studio打开新建基于RT-Thread的工程。
QQ截图20210204222616.jpg

在RT-Thread Studio中配置组件,这里主要添加了软件模拟I2C组件读取传感器。
2.jpg

使能软件模拟I2C。
3.jpg

软件模拟I2C的引脚PB8和PB9。
4.jpg

初始化I2C,和I2C读写函数。
  1.     /* 查找I2C总线设备,获取I2C总线设备句柄 */
  2.     i2c_bus = (struct rt_i2c_bus_device *)rt_device_find("i2c1");

  3.     if (i2c_bus == RT_NULL)
  4.     {
  5.         rt_kprintf("can't find i21 device!\n");
  6.     }
  1. void I2C_WriteByte(unsigned char dev_addr, unsigned int addr,unsigned char Byte)
  2. {
  3.     rt_uint8_t buf[4];
  4.     struct rt_i2c_msg msgs;

  5.     buf[0] = addr&0xff; //cmd
  6.     buf[1] = Byte;

  7.     msgs.addr = dev_addr;
  8.     msgs.flags = RT_I2C_WR;
  9.     msgs.buf = buf;
  10.     msgs.len = 2;

  11.     /* 调用I2C设备接口传输数据 */
  12.     rt_i2c_transfer(i2c_bus, &msgs, 1);

  13. }

  14. unsigned char I2C_ReadByte(unsigned char dev_addr, unsigned int addr)
  15. {  
  16.     rt_uint8_t buf[4];
  17.     struct rt_i2c_msg msgs[2];

  18.     buf[0] = addr&0xff; //cmd
  19.     msgs[0].addr = dev_addr;
  20.     msgs[0].flags = RT_I2C_WR;
  21.     msgs[0].buf = buf;
  22.     msgs[0].len = 1;

  23.     msgs[1].addr = dev_addr;
  24.     msgs[1].flags = RT_I2C_RD;
  25.     msgs[1].buf = buf;
  26.     msgs[1].len = 1;

  27.     /* 调用I2C设备接口传输数据 */
  28.     rt_i2c_transfer(i2c_bus, msgs, 2);
  29.        
  30.         return buf[0];
  31. }


  32. void I2C_PageWrite(unsigned char dev_addr,unsigned int addr,unsigned char *str,unsigned int num)   
  33. {
  34.     rt_uint8_t buf[4];
  35.     struct rt_i2c_msg msgs;

  36.     buf[0] = addr&0xff; //cmd
  37.     msgs.addr = dev_addr;
  38.     msgs.flags = RT_I2C_WR;
  39.     msgs.buf = buf;
  40.     msgs.len = 1;
  41.     /* 调用I2C设备接口传输数据 */
  42.     rt_i2c_transfer(i2c_bus, &msgs, 1);

  43.     msgs.addr = dev_addr;
  44.     msgs.flags = RT_I2C_WR;
  45.     msgs.buf = str;
  46.     msgs.len = num;
  47.     /* 调用I2C设备接口传输数据 */
  48.     rt_i2c_transfer(i2c_bus, &msgs, 1);
  49. }

  50. void I2C_PageRead(unsigned char dev_addr,unsigned int addr,unsigned char *str,unsigned int num)
  51. {
  52. //    rt_uint8_t buf[4];
  53. //    struct rt_i2c_msg msgs;
  54. //
  55. //    buf[0] = addr&0xff; //cmd
  56. //    msgs.addr = dev_addr;
  57. //    msgs.flags = RT_I2C_WR;
  58. //    msgs.buf = buf;
  59. //    msgs.len = 1;
  60. //    /* 调用I2C设备接口传输数据 */
  61. //    rt_i2c_transfer(i2c_bus, &msgs, 1);

  62. //    msgs.addr = dev_addr;
  63. //    msgs.flags = RT_I2C_RD;
  64. //    msgs.buf = str;
  65. //    msgs.len = num;
  66. //    /* 调用I2C设备接口传输数据 */
  67. //    rt_i2c_transfer(i2c_bus, &msgs, 1);

  68.     rt_uint8_t buf[4];
  69.     struct rt_i2c_msg msgs[2];

  70.     buf[0] = addr&0xff; //cmd
  71.     msgs[0].addr = dev_addr;
  72.     msgs[0].flags = RT_I2C_WR;
  73.     msgs[0].buf = buf;
  74.     msgs[0].len = 1;

  75.     msgs[1].addr = dev_addr;
  76.     msgs[1].flags = RT_I2C_RD;
  77.     msgs[1].buf = str;
  78.     msgs[1].len = num;

  79.     /* 调用I2C设备接口传输数据 */
  80.     rt_i2c_transfer(i2c_bus, msgs, 2);
  81. }


main主函数读取传感器数据:
  1. #include <rtthread.h>

  2. #define DBG_TAG "main"
  3. #define DBG_LVL DBG_LOG
  4. #include <rtdbg.h>

  5. #include <rtdevice.h>

  6. #include "gpio_i2c.h"
  7. #include "RPR-0521RS.h"
  8. #include "BM1422AGMV.h"
  9. #include "BM1383AGLV.h"

  10. #ifndef LED2_PIN_NUM
  11.     #define LED2_PIN_NUM            61  /* PD13 */
  12. #endif
  13. #ifndef LED3_PIN_NUM
  14.     #define LED3_PIN_NUM            62  /* PD14 */
  15. #endif
  16. #ifndef LED4_PIN_NUM
  17.     #define LED4_PIN_NUM            63    /* PD15 */
  18. #endif

  19. int main(void)
  20. {
  21.     uint8_t         utbuff[6];
  22.     float press; float temp;
  23.     uint16_t ps; float als;

  24.     i2c_gpio_init();

  25.     rt_pin_mode(LED2_PIN_NUM, PIN_MODE_OUTPUT);
  26.     rt_pin_write(LED2_PIN_NUM, PIN_HIGH);
  27.     rt_pin_mode(LED3_PIN_NUM, PIN_MODE_OUTPUT);
  28.     rt_pin_write(LED3_PIN_NUM, PIN_HIGH);
  29.     rt_pin_mode(LED4_PIN_NUM, PIN_MODE_OUTPUT);
  30.     rt_pin_write(LED4_PIN_NUM, PIN_HIGH);

  31.     if(RPR0521RS_Init() == 0)
  32.     {
  33.         rt_kprintf("RPR0521RS_Init OK\r\n");
  34.     }
  35.     if(BM1422AGMV_Init() == 0)
  36.     {
  37.         rt_kprintf("BM1422AGMV_Init OK\r\n");
  38.     }
  39.     if(BM1383AGLV_Init() == 0)
  40.     {
  41.         rt_kprintf("BM1383AGLV_Init OK\r\n");
  42.     }

  43.     while (1)
  44.     {
  45.         //LOG_D("Hello RT-Thread!");
  46.         rt_thread_mdelay(500);
  47.         rt_pin_write(LED4_PIN_NUM, PIN_HIGH);
  48.         rt_pin_write(LED2_PIN_NUM, PIN_LOW);
  49.         rt_thread_mdelay(500);
  50.         rt_pin_write(LED2_PIN_NUM, PIN_HIGH);
  51.         rt_pin_write(LED3_PIN_NUM, PIN_LOW);
  52.         rt_thread_mdelay(500);
  53.         rt_pin_write(LED3_PIN_NUM, PIN_HIGH);
  54.         rt_pin_write(LED4_PIN_NUM, PIN_LOW);


  55.         RPR0521RS_get_psalsval(&ps,&als);
  56.         rt_kprintf("RPR0521RS:Lx=%u\t\tPs=%d\n",(uint16_t)als,ps);
  57.         BM1383AGLV_get_val(&press,&temp);
  58.         rt_kprintf("BM1383AGLV:P=%u\t\tTem=%u\n",(uint16_t)press,(uint16_t)temp);
  59.         BM1422AGMV_get_rawdata(utbuff);
  60.         rt_kprintf("BM1422AGMV:xx=%u\t\tyy=%u\t\tzz=%u\r\n\n",(uint16_t)(utbuff[1]<<8)|utbuff[0],
  61.                                                         (uint16_t)(utbuff[3]<<8)|utbuff[2],
  62.                                                         (uint16_t)(utbuff[5]<<8)|utbuff[4]);

  63.    }

  64.     return RT_EOK;
  65. }


通过串口输出的数据:
5.jpg
1.jpg

代码工程:
游客,如果您要查看本帖隐藏内容请回复



数据采集存储 发表于 2021-2-19 18:41 | 显示全部楼层
使用工具之后,感觉代码简单多了。
saintloong 发表于 2021-2-20 09:34 | 显示全部楼层
有源码的都是好同志
hbxhang68 发表于 2021-3-18 20:48 | 显示全部楼层
感谢分享
bxtinglove0421 发表于 2021-4-22 22:01 | 显示全部楼层
感谢分享源码
怀揣少年梦 发表于 2023-8-23 21:56 | 显示全部楼层
感谢分享
无语风 发表于 2023-9-19 14:53 | 显示全部楼层
感谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

4784

帖子

28

粉丝
快速回复 在线客服 返回列表 返回顶部