IIC读数据读完第一个字节并应答后读不出第二个字节

在使用IIC读取传感器数据时,给从机读取命令并收到从机应答,接收到第一个字节后给从机应答信号,但此时接收不到第二个字节的数据。

这种情况可能是应答信号的问题。

原本应答函数为

void IIC_Ack(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=0;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;

}

在主机应答后,要将SDA拉高,一遍下一次传输,改成这样。

void IIC_Ack(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=0;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
	delay_us(2);
	IIC_SDA=1;
	delay_us(2);
}

修改应答信号后即可解决问题。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,需要在代码中定义IIC的相关参数,如SCL和SDA的GPIO引脚、时钟频率、器件地址等。然后,可以使用以下代码来向器件发送多个字节数据: ```c #include "gd32f10x.h" #define IIC_SCL_PIN GPIO_PIN_7 #define IIC_SCL_GPIO_PORT GPIOB #define IIC_SDA_PIN GPIO_PIN_6 #define IIC_SDA_GPIO_PORT GPIOB #define IIC_SCL_HIGH() gpio_bit_set(IIC_SCL_GPIO_PORT, IIC_SCL_PIN) #define IIC_SCL_LOW() gpio_bit_reset(IIC_SCL_GPIO_PORT, IIC_SCL_PIN) #define IIC_SDA_HIGH() gpio_bit_set(IIC_SDA_GPIO_PORT, IIC_SDA_PIN) #define IIC_SDA_LOW() gpio_bit_reset(IIC_SDA_GPIO_PORT, IIC_SDA_PIN) #define IIC_SDA_READ() gpio_input_bit_get(IIC_SDA_GPIO_PORT, IIC_SDA_PIN) #define IIC_DELAY() delay_us(1) void iic_start(void) { IIC_SDA_HIGH(); IIC_SCL_HIGH(); IIC_DELAY(); IIC_SDA_LOW(); IIC_DELAY(); IIC_SCL_LOW(); } void iic_stop(void) { IIC_SDA_LOW(); IIC_SCL_HIGH(); IIC_DELAY(); IIC_SDA_HIGH(); IIC_DELAY(); } void iic_send_byte(uint8_t data) { for (uint8_t i = 0; i < 8; i++) { if (data & 0x80) { IIC_SDA_HIGH(); } else { IIC_SDA_LOW(); } IIC_DELAY(); IIC_SCL_HIGH(); IIC_DELAY(); IIC_SCL_LOW(); data <<= 1; } IIC_SDA_HIGH(); IIC_DELAY(); IIC_SCL_HIGH(); IIC_DELAY(); IIC_SCL_LOW(); } void iic_send_data(uint8_t addr, uint8_t* data, uint8_t len) { iic_start(); iic_send_byte(addr << 1); for (uint8_t i = 0; i < len; i++) { iic_send_byte(data[i]); } iic_stop(); } ``` 在上述代码中,`iic_start()`和`iic_stop()`函数分别用于发送起始信号和停止信号。`iic_send_byte()`函数用于发送一个字节数据。`iic_send_data()`函数用于发送多个字节数据,其中`addr`为器件地址,`data`为数据缓冲区指针,`len`为数据长度。需要注意的是,在发送每个字节数据时,都需要在最后一个时钟周期释放SDA线,以便让器件发送应答信号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值