(6)获取从机给主机的ACK信号
uint8 iic_get_ack()
{
uint8 ret;
SCL = HIGH;
delay(50);
ret = SDA;
SCL = LOW;
delay(50);
return ret;
}
四、读取LM75测量的温度值
通过IIC读取LM75测量温度值的时序如下:
实例代码如下:
unsigned int __read_lm75()
{
uint8 ack;
uint8 high,low;
//设置IIC连接的pin为输出模式
SET_GPIO_MODE(GPD.GPDCON,3,1);
SET_GPIO_MODE(GPD.GPDCON,4,1);
delay(100);
//产生起始信号
iic_start();
//发送从机地址
iic_write_byte(0x91);
//设置IIC连接的pin(SDA)为输入模式
SET_GPIO_MODE(GPD.GPDCON,3,0);
//等待从机的ACK
do{
ack = iic_get_ack();
}while(ack);
//读取从机发送过来的数据
high = iic_read_byte();
//设置IIC连接的pin(SDA)为输出模式
SET_GPIO_MODE(GPD.GPDCON,3,1);
//发送ACK信号
iic_send_ack();
//设置IIC连接的pin(SDA)为输入模式
SET_GPIO_MODE(GPD.GPDCON,3,0);
//读取从机发送过来的数据
low = iic_read_byte();
//设置IIC连接的pin(SDA)为输出模式
SET_GPIO_MODE(GPD.GPDCON,3,1);
//发送停止信号
iic_stop();
return (high << 8) | low;
}
实验的经验:
1.读不到从机发送的ACK信号,原因是没有将SDA的那根线设为输入模式
2.在做的过程中,一开始每次读取的时候温度的值一直没有改变,后来发现是由于每次没有发送停止信号产生的。
|