- UID
- 1029342
- 性别
- 男
|
关于IIC的介绍,读者可以参看fs2410裸奔之IIC一文,这里重点介绍如何用GPIO模拟IIC。
先来看看LM75硬件的上的连线:
其中I2C_SDA0是数据线,I2C_SCL0是时钟线,它们分别接到s5pc100的GPD3和GPD4,如下图所示
在模拟IIC的时候,用GPD3引脚发送数据或读取数据,用GPD4引脚提供时钟信号即可。
由于s5pc100的GPD这一组的引脚很多,不好单独对其中的某一个引脚操作,为了能单独对其中的某一个管脚单独操作,这里使用了C语言的位域。
typedef struct
{
uint8 GPDDAT_0:1;
uint8 GPDDAT_1:1;
uint8 GPDDAT_2:1;
uint8 GPDDAT_3:1;
uint8 GPDDAT_4:1;
uint8 GPDDAT_5:1;
uint8 GPDDAT_6:1;
uint8 GPDDAT_7:1;
}gpddat_t;
#define GPD_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()
{
SDA = HIGH;
SCL = HIGH;
delay(50);
//高到低的跳变产生start信号
SDA = LOW;
delay(50);
//在SCL高时,SDA必须保持稳定,SCL低时,SDA可以任意改变
//此处将SCL拉低的目的是,接下来就要发送数据了
SCL = LOW;
delay(50);
return;
}
(2)产生IIC停止信号
SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据
/*IIC STOP:SCL = 1,SDA = 0->1*/
void iic_stop()
{
SDA = LOW;
SCL = LOW;
delay(50);
SCL = HIGH;
delay(50);
//SCL为高电平时,SDA从低电平跳变到高电平
//,产生停止信号
SDA = HIGH;
delay(50);
return;
}
|
|