使用模拟I2C读取硒翔30mL/min流量传感器
该工程使用某些采样次数和时间不同会采集到的报文有问题。
我建议是可以换个次数和时间调下。
如果报文有问题的话 就修改延时就好了,延时指的是I2C每发送一个命令之间的延时。
硒翔传感器默认地址为1,实际上应该是0x02,
按照报文上所写,
A6 | A5 | A4 | A3 | A2 | A1 | A0 | R/W(读写标志位) |
---|---|---|---|---|---|---|---|
8 | 4 | 2 | 1 | 8 | 4 | 2 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | R/W |
我理解的是这样的 ,所以我的地址才改为4。只是为了方便,而且挂载的设备没那么多。
代码很乱,有些是过程中调试使用的,懒得删掉了。
模拟I2C的代码使用的是STM32F429的模拟I2C读取E2PROM的例程
gpio配置部分
/**
******************************************************************************
* @file bsp_i2c_ee.c
* @version V1.0
* @date 2013-xx-xx
* @brief 用gpio模拟i2c总线, 适用于STM32系列CPU。该模块不包括应用层命令帧,仅包括I2C总线基本操作函数。
******************************************************************************
#include "./30mL_I2C/bsp_i2c_gpio.h"
static void i2c_CfgGpio(void);
/*
*********************************************************************************************************
* 函 数 名: i2c_Delay
* 功能说明: I2C总线位延迟,最快400KHz
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Delay(void)
{
uint8_t i;
// /*
// 可用逻辑分析仪测量I2C通讯时的频率
// 工作条件:CPU主频180MHz ,MDK编译环境,1级优化
//
// 经测试,循环次数为20~250时都能通讯正常
//使用示波器测量波形一定使用上拉电阻
//使用示波器测量波形一定使用上拉电阻
//使用示波器测量波形一定使用上拉电阻
//使用示波器测量波形一定使用上拉电阻
//使用示波器测量波形一定使用上拉电阻
//使用示波器测量波形一定使用上拉电阻
// */
for (i = 0; i < 174; i++);
//这里这么写是因为传感器有I2C的时钟要求,所以这里进行了处理,实际下载到板子上的频率应该是100.2KHz左右。
}
/*
*********************************************************************************************************
* 函 数 名: i2c_Start
* 功能说明: CPU发起I2C总线启动信号
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Start(void)
{
/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
EEPROM_I2C_SDA_1();
EEPROM_I2C_SCL_1();
i2c_Delay();
EEPROM_I2C_SDA_0();
i2c_Delay();
EEPROM_I2C_SCL_0();
i2c_Delay();
}
/*
*********************************************************************************************************
* 函 数 名: i2c_Start
* 功能说明: CPU发起I2C总线停止信号
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Stop(void)
{
/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */
EEPROM_I2C_SDA_0();
EEPROM_I2C_SCL_1();
i2c_Delay();
EEPROM_I2C_SDA_1();
}
/*
*********************************************************************************************************
* 函 数 名: i2c_SendByte
* 功能说明: CPU向I2C总线设备发送8bit数据
* 形 参:_ucByte : 等待发送的字节
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_SendByte(uint8_t _ucByte)
{
uint8_t i;
/* 先发送字节的高位bit7 */
for (i = 0; i < 8; i++)
{
if (_ucByte & 0x80)
{
EEPROM_I2C_SDA_1();
}
else
{
EEPROM_I2C_SDA_0();
}
i2c_Delay();
EEPROM_I2C_SCL_1();
i2c_Delay();
EEPROM_I2C_SCL_0();
if (i == 7)
{
EEPROM_I2C_SDA_1(); // 释放总线
}
_ucByte <<= 1; /* 左移一个bit */
i2c_Delay();
}
}
/*
*********************************************************************************************************
* 函 数 名: i2c_ReadByte
* 功能说明: CPU从I2C总线设备读取8bit数据
* 形 参:无
* 返 回 值: 读到的数据
*********************************************************************************************************
*/
uint8_t i2c_ReadByte(void)
{
uint8_t i;
uint8_t value;
/* 读到第1个bit为数据的bit7 */
value = 0;
for (i = 0; i < 8; i++)
{
value <<= 1;
EEPROM_I2C_SCL_1();
i2c_Delay();
if (EEPROM_I2C_SDA_READ())
{
//value = value | 0x01;
value++;
}
EEPROM_I2C_SCL_0();
i2c_Delay();
}
return value;
}
/*
*********************************************************************************************************
* 函 数 名: i2c_WaitAck
* 功能说明: CPU产生一个时钟,并读取器件的ACK应答信号
* 形 参:无
* 返 回 值: 返回0表示正确应答,1表示无器件响应
*********************************************************************************************************
*/
uint8_t i2c_WaitAck(void)
{
uint8_t re;
EEPROM_I2C_SDA_1(); /* CPU释放SDA总线 */
i2c_Delay();
EEPROM_I2C_SCL_1(); /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
i2c_Delay();
if (EEPROM_I2C_SDA_READ()) /* CPU读取SDA口线状态 */
{
re = 1;
//printf("CPU读取SDA口线状态为1 \r\n");
}
else
{
re = 0;
//printf("CPU读取SDA口线状态为0 \r\n");
}
EEPROM_I2C_SCL_0();
i2c_Delay();
return re;
}
/*
*********************************************************************************************************
* 函 数 名: i2c_Ack
* 功能说明: CPU产生一个ACK信号
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Ack(void)
{
EEPROM_I2C_SDA_0()