先来看看LM75硬件的上的连线:

其中I2C_SDA0是数据线,I2C_SCL0是时钟线,它们分别接到s5pc100的GPD3和GPD4,如下图所示

在模拟IIC的时候,用GPD3引脚发送数据或读取数据,用GPD4引脚提供时钟信号即可。
由于s5pc100的GPD这一组的引脚很多,不好单独对其中的某一个引脚操作,为了能单独对其中的某一个管脚单独操作,这里使用了C语言的位域。
typedef struct
{
}gpddat_t;
#defineGPD_DAT (* (volatile gpddat_t *)0xE0300084)
#define SDA GPD_DAT.GPDDAT_3
#define SCL GPD_DAT.GPDDAT_4
(1)产生IIC起始信号
SCL 为高电平时,SDA由高电平向低电平跳变,开始传送数据
/*IIC START:SCL = 1,SDA = 1->0*/
void iic_start()
{
return;
}
(2)产生IIC停止信号
SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据
/*IIC STOP:SCL = 1,SDA = 0->1*/
void iic_stop()
{
}
(3)发送数据
/*Write 1 Byte to IIC*/
void iic_write_byte(uint8 data)
{
}
(4)读取数据
/*Read 1 byte from IIC*/
uint8 iic_read_byte()
{
}
return value;
}
(5)主机向从机发送ACK信号
void iic_send_ack()
{
}
(6)获取从机给主机的ACK信号
uint8 iic_get_ack()
{
}
四、读取LM75测量的温度值
通过IIC读取LM75测量温度值的时序如下:
实例代码如下:
unsigned int __read_lm75()
{
}
实验的经验:
1.读不到从机发送的ACK信号,原因是没有将SDA的那根线设为输入模式
2.在做的过程中,一开始每次读取的时候温度的值一直没有改变,后来发现是由于每次没有发送停止信号产生的。