你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L051测试I2C协议设备的添加经验分享

[复制链接]
攻城狮Melo 发布时间:2023-6-12 19:11
1、CubeMX IO口的设置

模拟I2C的IO口都设置为开漏输出,因为电路图上有外部上拉。初始化的时候,2个SDA和SCL都得拉高。所以设置如下:



微信图片_20230612191118.png


2、HAL库中的us延时函数

在HAL库中,只有ms的延时函数HAL_Delay,没有us的延时函数,今天用了网上一个延时函数,发现有问题,搞得整个时钟出了问题,郁闷,折腾了一下午。时间浪费了,通讯模块那边因为这个时钟设置也出了点问题,一直返回复位信息,用了怎么多年的芯片还第一次遇到,Enocean 的TCM310模块,主要这个技术支持也不太好找。= =!还是快速找一个us函数,不是那么精确也可以,直接用空语句测试,后面已经经过测试,下面这个函数做的us延时可以正常移植以前的I2C程序。

  1. /* USER CODE BEGIN 4 */
  2. void delay_us(uint32_t Delay)
  3. {
  4.   uint32_t cnt = Delay * 8;  
  5.   uint32_t i = 0;
  6.   for(i = 0; i < cnt; i++)__NOP();
  7. }
  8. /* USER CODE END 4 */
复制代码

3、移植I2C代码3.1  SHT21温湿度传感器

代码移植没什么问题, i2c.c:

  1. #include "i2c.h"

  2. // ------------------------------------------------------------------
  3. void i2c_init(void)  {
  4.   
  5. // the SDA and SCL pins are defined as input with pull up enabled
  6.   // pins are initialized as inputs, ext. pull => SDA and SCL = high

  7. }
  8. // ------------------------------------------------------------------
  9. // send start sequence (S)

  10. void i2c_start(void)  {                                    
  11.    sda_high();
  12.   delay_us(10);
  13.    scl_high();  
  14.   delay_us(10);
  15.    sda_low();
  16.   delay_us(10);
  17. scl_low();                                                   
  18.   delay_us(10);
  19. }
  20. // ------------------------------------------------------------------
  21. // send stop sequence (P)
  22. void i2c_stop(void)  {                             
  23.    sda_low();                                                                          
  24.   delay_us(10);
  25.    scl_low();                                       
  26.   delay_us(10);                                 
  27.    scl_high();                                         
  28.   delay_us(10);                                       
  29.    sda_high();
  30.   delay_us(10);
  31. }
  32. // ------------------------------------------------------------------
  33. // returns the ACK or NACK
  34. uint8 i2c_write(uint8 u8Data)
  35. {
  36. uint8 u8Bit;
  37. uint8 u8AckBit;
  38. // write 8 data bits
  39. u8Bit = 0x80;  //msb first  
  40. while(u8Bit) {
  41.   if(u8Data&u8Bit) {
  42.    sda_high();
  43.    delay_us(20);
  44.   }
  45.   //& compare every bit
  46.   else{
  47.    sda_low();
  48.    delay_us(20);
  49.   }   
  50.   scl_high();
  51.   delay_us(30);
  52.   u8Bit >>= 1;
  53.   //next bit
  54.   scl_low();
  55.   delay_us(30);
  56. }
  57. // read acknowledge (9th bit)
  58. sda_high();                                               
  59. delay_us(10);  
  60. scl_high();
  61. delay_us(10);
  62. u8AckBit= sda_read(); //#define sda_read()  (sda_port & sda_pin)? 1 :0  ack on bus is low -> u8AckBit = 1   sda_port gpio0   sda_pin SCSEDIO0
  63. delay_us(10);
  64.     scl_low();                                             
  65. delay_us(10);
  66.     return u8AckBit;
  67. }
  68. // ------------------------------------------------------------------
  69. // pass the ack/nack
  70. // returns the read data
  71. uint8 i2c_read(uint8 u8Ack)  
  72. {
  73. uint8 u8Bit;
  74. uint8 u8Data;
  75. u8Bit = 0x80;       // msb first
  76. u8Data = 0;
  77. while(u8Bit){
  78.   scl_high();
  79.   
  80.   delay_us(20);

  81.   u8Bit >>= 1;    //next bit
  82.   u8Data <<= 1;

  83.   u8Data |= sda_read();         //(sda_port & sda_pin)? 1 :0      sda_port gpio0   sda_pin SCSEDIO0
  84.   delay_us(20);

  85.   scl_low();
  86.   delay_us(50);
  87.     }
  88. // 9th bit acknowledge
  89. if(u8Ack==I2C_ACK) {
  90.   sda_low();
  91.   delay_us(20);
  92. }     
  93. //I2C_ACK=0
  94. else {
  95.   sda_high();
  96.   delay_us(20);
  97. }
  98.    scl_high();
  99. delay_us(20);
  100. scl_low();
  101. delay_us(20);
  102. sda_high();
  103. delay_us(20);         
  104.     return u8Data;
  105. }
复制代码

i2c.h:

  1. #ifndef _I2C_H_INCLUDED
  2. #define _I2C_H_INCLUDED

  3. #include "main.h"
  4. #include "Datadef.h"
  5.         
  6. // #define I2C_CLK_HIGH()  HAL_GPIO_WritePin(sht_scl_GPIO_Port,sht_scl_Pin,GPIO_PIN_SET);
  7. // #define I2C_CLK_LOW()   HAL_GPIO_WritePin(sht_scl_GPIO_Port,sht_scl_Pin,GPIO_PIN_RESET);

  8. // #define I2C_DATA_HIGH()   HAL_GPIO_WritePin(sht_sda_GPIO_Port,sht_sda_Pin,GPIO_PIN_SET);
  9. // #define I2C_DATA_LOW()    HAL_GPIO_WritePin(sht_sda_GPIO_Port,sht_sda_Pin,GPIO_PIN_RESET);  
  10. // #define I2C_DATA_STATE()  (HAL_GPIO_ReadPin(sht_sda_GPIO_Port,sht_sda_Pin) == GPIO_PIN_SET);

  11. // #define sda_high()  I2C_DATA_HIGH()     // set signals to HIGH first before selecting IN -> slew rates
  12. // #define sda_low()   I2C_DATA_LOW()
  13. // #define sda_read()  I2C_DATA_STATE()    //ack on bus is low -> u8AckBit = 1

  14. // #define scl_high()  I2C_CLK_HIGH()     // set signals to HIGH first before selecting IN -> slew rates
  15. // #define scl_low()   I2C_CLK_LOW()

  16. #define sda_high()  HAL_GPIO_WritePin(sht_sda_GPIO_Port,sht_sda_Pin,GPIO_PIN_SET);
  17. #define sda_low()   HAL_GPIO_WritePin(sht_sda_GPIO_Port,sht_sda_Pin,GPIO_PIN_RESET);
  18. #define sda_read()  (HAL_GPIO_ReadPin(sht_sda_GPIO_Port,sht_sda_Pin) == GPIO_PIN_SET);

  19. #define scl_high()  HAL_GPIO_WritePin(sht_scl_GPIO_Port,sht_scl_Pin,GPIO_PIN_SET);
  20. #define scl_low()   HAL_GPIO_WritePin(sht_scl_GPIO_Port,sht_scl_Pin,GPIO_PIN_RESET);
  21.                         
  22.                         
  23. // ------------------------
  24. #define DONOTHING()          {;}

  25. // ------------------------
  26. // command's
  27. #define I2C_WRITE             0
  28. #define I2C_READ              1
  29. #define I2C_ACK               0
  30. #define I2C_NACK              1

  31. void i2c_init(void);
  32. void i2c_start(void);
  33. void i2c_stop(void);
  34. uint8 i2c_write(uint8 u8Data);
  35. uint8 i2c_read(uint8 u8Ack);

  36. #endif
复制代码

SHT21部分的驱动就不用怎么修改了,基本上直接拿过来,把ms延时函数替换一下,就直接用,这里就不贴出来

测试结果:


微信图片_20230612191105.png


板载的HTU21D,实际测试下来,一直会比空气问题高一点,这个问题,我倒是有点头疼,虽然做过分割,不铺铜等一些处理,还是不尽如人意。


转载自:矜辰所致

如有侵权请联系删除



收藏 评论0 发布时间:2023-6-12 19:11

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版