1、CubeMX IO口的设置 模拟I2C的IO口都设置为开漏输出,因为电路图上有外部上拉。初始化的时候,2个SDA和SCL都得拉高。所以设置如下:
2、HAL库中的us延时函数
在HAL库中,只有ms的延时函数HAL_Delay,没有us的延时函数,今天用了网上一个延时函数,发现有问题,搞得整个时钟出了问题,郁闷,折腾了一下午。时间浪费了,通讯模块那边因为这个时钟设置也出了点问题,一直返回复位信息,用了怎么多年的芯片还第一次遇到,Enocean 的TCM310模块,主要这个技术支持也不太好找。= =!还是快速找一个us函数,不是那么精确也可以,直接用空语句测试,后面已经经过测试,下面这个函数做的us延时可以正常移植以前的I2C程序。 - /* USER CODE BEGIN 4 */
- void delay_us(uint32_t Delay)
- {
- uint32_t cnt = Delay * 8;
- uint32_t i = 0;
- for(i = 0; i < cnt; i++)__NOP();
- }
- /* USER CODE END 4 */
复制代码
3、移植I2C代码3.1 SHT21温湿度传感器代码移植没什么问题, i2c.c:
i2c.h: - #ifndef _I2C_H_INCLUDED
- #define _I2C_H_INCLUDED
- #include "main.h"
- #include "Datadef.h"
-
- // #define I2C_CLK_HIGH() HAL_GPIO_WritePin(sht_scl_GPIO_Port,sht_scl_Pin,GPIO_PIN_SET);
- // #define I2C_CLK_LOW() HAL_GPIO_WritePin(sht_scl_GPIO_Port,sht_scl_Pin,GPIO_PIN_RESET);
- // #define I2C_DATA_HIGH() HAL_GPIO_WritePin(sht_sda_GPIO_Port,sht_sda_Pin,GPIO_PIN_SET);
- // #define I2C_DATA_LOW() HAL_GPIO_WritePin(sht_sda_GPIO_Port,sht_sda_Pin,GPIO_PIN_RESET);
- // #define I2C_DATA_STATE() (HAL_GPIO_ReadPin(sht_sda_GPIO_Port,sht_sda_Pin) == GPIO_PIN_SET);
- // #define sda_high() I2C_DATA_HIGH() // set signals to HIGH first before selecting IN -> slew rates
- // #define sda_low() I2C_DATA_LOW()
- // #define sda_read() I2C_DATA_STATE() //ack on bus is low -> u8AckBit = 1
- // #define scl_high() I2C_CLK_HIGH() // set signals to HIGH first before selecting IN -> slew rates
- // #define scl_low() I2C_CLK_LOW()
- #define sda_high() HAL_GPIO_WritePin(sht_sda_GPIO_Port,sht_sda_Pin,GPIO_PIN_SET);
- #define sda_low() HAL_GPIO_WritePin(sht_sda_GPIO_Port,sht_sda_Pin,GPIO_PIN_RESET);
- #define sda_read() (HAL_GPIO_ReadPin(sht_sda_GPIO_Port,sht_sda_Pin) == GPIO_PIN_SET);
- #define scl_high() HAL_GPIO_WritePin(sht_scl_GPIO_Port,sht_scl_Pin,GPIO_PIN_SET);
- #define scl_low() HAL_GPIO_WritePin(sht_scl_GPIO_Port,sht_scl_Pin,GPIO_PIN_RESET);
-
-
- // ------------------------
- #define DONOTHING() {;}
- // ------------------------
- // command's
- #define I2C_WRITE 0
- #define I2C_READ 1
- #define I2C_ACK 0
- #define I2C_NACK 1
- void i2c_init(void);
- void i2c_start(void);
- void i2c_stop(void);
- uint8 i2c_write(uint8 u8Data);
- uint8 i2c_read(uint8 u8Ack);
- #endif
复制代码
SHT21部分的驱动就不用怎么修改了,基本上直接拿过来,把ms延时函数替换一下,就直接用,这里就不贴出来 测试结果:
板载的HTU21D,实际测试下来,一直会比空气问题高一点,这个问题,我倒是有点头疼,虽然做过分割,不铺铜等一些处理,还是不尽如人意。
转载自:矜辰所致 如有侵权请联系删除
|