TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

MSP430FR6972: 为什么我用该芯片与ADS1115连接时无法通信

Part Number: MSP430FR6972
Other Parts Discussed in Thread: ADS1115

// 定义 I2C 接口的 GPIO 引脚,用户根据实际硬件连接修改
#define SOFT_I2C_SCL_PIN GPIO_PIN7 // 连接到 SCL 时钟线的 GPIO
#define SOFT_I2C_SDA_PIN GPIO_PIN6 // 连接到 SDA 数据线的 GPIO

// 定义引脚读写操作
#define I2C_SCL_1() GPIO_setOutputHighOnPin(GPIO_PORT_P1, SOFT_I2C_SCL_PIN) /* SCL = 1 */
#define I2C_SCL_0() GPIO_setOutputLowOnPin(GPIO_PORT_P1, SOFT_I2C_SCL_PIN) /* SCL = 0 */
#define I2C_SDA_1() GPIO_setOutputHighOnPin(GPIO_PORT_P1, SOFT_I2C_SDA_PIN) /* SDA = 1 */
#define I2C_SDA_0() GPIO_setOutputLowOnPin(GPIO_PORT_P1, SOFT_I2C_SDA_PIN) /* SDA = 0 */
#define I2C_SDA_READ() GPIO_getInputPinValue(GPIO_PORT_P1, SOFT_I2C_SDA_PIN)


/**************起始信号***************/
void i2c_Start()
{
I2C_SDA_1();
I2C_SCL_1();
delay_us(10);
I2C_SDA_0();
delay_us(10);
I2C_SCL_0();
delay_us(10);
}
/*************终止信号*************/
void i2c_Stop()
{
I2C_SDA_0();
I2C_SCL_1();
delay_us(10);
I2C_SDA_1();
delay_us(10);
}

/*************
* 9 写字节
*/
void i2c_SendByte(uint8_t data)
{
uint8_t i;
for(i = 0;i < 8;i++)
{
if(data & 0x80)
I2C_SDA_1();
else
I2C_SDA_0();
delay_us(10);
I2C_SCL_1();
delay_us(10);
I2C_SCL_0();
if (i == 7)
I2C_SDA_1();
data <<= 1;
delay_us(10);
}
}

/**************
* 读字节
*/
uint8_t i2c_ReadByte(uint8_t ack)
{
uint8_t i;
uint8_t value = 0;

for (i = 0; i < 8; i++)
{
value <<= 1;
I2C_SCL_1();
delay_us(10);
if (I2C_SDA_READ())
{
value++;
}
I2C_SCL_0();
delay_us(10);
}
if (ack == 0)
i2c_NAck();
else
i2c_Ack();
return value;
}

// 等待应答
uint8_t i2c_WaitAck(void)
{
uint8_t re;

I2C_SDA_1();
delay_us(10);
I2C_SCL_1();
delay_us(10);
GPIO_setAsInputPin(GPIO_PORT_P1, SOFT_I2C_SDA_PIN);
if (I2C_SDA_READ())
{
re = 1;
}
else
{
re = 0;
}
I2C_SCL_0();
delay_us(10);
GPIO_setAsOutputPin(GPIO_PORT_P1, SOFT_I2C_SDA_PIN);
return re;
}

// 发送应答
void i2c_Ack(void)
{
I2C_SDA_0();
delay_us(10);
I2C_SCL_1();
delay_us(10);
I2C_SCL_0();
delay_us(10);
I2C_SDA_1();
}

// 发送非应答
void i2c_NAck(void)
{
I2C_SDA_1();
delay_us(10);
I2C_SCL_1();
delay_us(10);
I2C_SCL_0();
delay_us(10);
}


void i2c_GPIO_Config(void)
{
GPIO_setAsOutputPin(GPIO_PORT_P1, SOFT_I2C_SCL_PIN);
GPIO_setAsOutputPin(GPIO_PORT_P1, SOFT_I2C_SDA_PIN);
I2C_SCL_1();
I2C_SDA_1();
i2c_Stop();
}

/**
* @brief 写数据到ADS1115的寄存器
* @param
* @retval
*/
void ADS1115_WriteReg(uint8_t reg_add, uint8_t config_h, uint8_t config_l)
{
i2c_Start();
i2c_SendByte(ADS1115_SLAVE_ADDRESS);
if(i2c_WaitAck())
while(1);
i2c_SendByte(reg_add);
if(i2c_WaitAck())
while(1);
i2c_SendByte(config_h);
if(i2c_WaitAck())
while(1);
i2c_SendByte(config_l);
if(i2c_WaitAck())
while(1);
i2c_Stop();
}

/**
* @brief 从ADS1115的寄存器读取数据
* @param
* @retval
*/
void ADS1115_ReadData(uint8_t reg_add, unsigned char *Read, uint8_t num)
{
unsigned char i;

i2c_Start();
i2c_SendByte(ADS1115_SLAVE_ADDRESS);
if(i2c_WaitAck())
while(1);

i2c_SendByte(reg_add);
if(i2c_WaitAck())
while(1);
i2c_Stop();
i2c_Start();
i2c_SendByte(ADS1115_SLAVE_ADDRESS + 1);
if(i2c_WaitAck())
while(1);

for (i = 0; i < (num - 1); i++)
{
*Read = i2c_ReadByte(1);
Read++;
}
*Read = i2c_ReadByte(0);
i2c_Stop();
}


/**
* @brief ADS1115初始化
* @param
* @retval
*/
void ADS1115_Init(void)
{
ADS1115_WriteReg(0x01, 0xC0, 0x83); // 初始化模式,选择输入通道,增益,数据速率,比较器模式等
}

  • 您好,

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 您好

    客户如何在fr6972和ADS1115之间进行硬件连接?

    我看到客户使用GPIO来模拟I2C,为什么不使用fr6972中的硬件I2C模块呢?只需遵循以下ADS1115协议

    客户还可以在这里通过saleae捕获I2C波形进行分析。