1.实现过程说明
利用两个GPIO来模拟IIC总线,一跟用来模拟时钟SCL输出,而另一根用来模拟数据线SDA,通过时钟线产生的时序来传输(读or写)数据。
IIC总线的写数据过程:
1. 传输开始信号启动从机
2. 传输8位的从机地址(slave ID)
3. 从机应答信号(0:应答(ACK);1:无应答)
4. 写从机寄存器地址
5. 从机应答信号
6. 写一个字节数据
7. 从机应答信号
8. 传输停止信号(设备停止)
9. 延时1ms左右(是必要的,因为设备关闭需要一定的时间,否则下一次启动会发生错误)
IIC总线的读数据过程:
1. 传输开始信号启动从机
2. 传输8位的从机地址(slave ID)
3. 写从机寄存器地址
4. 从机停止
5. 重新启动从机
6. 传输8位的从机地址与读信号(slave ID|0x01)
7. 读数据(8位数据无应答,16位数据传输前8位后主机要应答一次)
8. 从机停止
9. 延时1ms左右(是必要的,因为设备关闭需要一定的时间,否则下一次启动会发生错误)
(从及地址最低位为本次数据传输的方向:0为写,1为读)
在每次数据传输的时候都需要发送启动信号和停止信号!
2.开始结束条件实现
开始条件和结束条件
开始条件代码:结束条件代码:
{
IIC_GPIO_SDA_CFG_OUTPUT;
IIC_SDA_HIGH;
IIC_SCL_HIGH;
//SCL must >4.7us
IIC_Wait(5);
IIC_SDA_LOW;
IIC_Wait(5);
IIC _SCL_LOW;
return 0;
}
{
IIC_GPIO_SDA_CFG_OUTPUT;
IIC_SDA_LOW;
IIC_Wait(5);
IIC_SCL_HIGH;
//SCL must >4.7us
IIC_Wait(5);
IIC_SDA_HIGH;
return 0;
}
由于初始化的时候我们将模拟SCL的GPIO初始化为输出,而对SDA的GPIO不进行初始化,根据操作来设置SDA的方向。
其中IIC的延时根据你的当前系统时钟等需要重新的调试。
3.IIC读写显示
写字节的代码如下,真正的实现可以在对本文档中的函数进行再封装!
{
uint32 bit;
int Status;
IIC_GPIO_SDA_CFG_OUTPUT;
IIC_Wait(1);
for(bit=0;bit<8;bit++)
{
//we start write the data, now we write high bit
if((data<<bit)&0x80)
{
IIC_SDA_HIGH;
}
else
{
IIC_SDA_LOW;
}
// we must delay //then we may debug ok
IIC_Wait (5);
IIC_SCL_HIGH;
IIC_Wait (5);
IIC_SCL_LOW;
}
//the following receiver ack signed
IIC_GPIO_SDA_CFG_INPUT;
IIC_Wait(1);
IIC_SCL_HIGH;
IIC_Wait(1);
if(IIC_SDA_VALUE&0x0100)
{
Status = -1;
}
else
{
Status = 0;
}
IIC_Wait(2);
IIC_SCL_LOW;
return Status;
}
读字节的代码:附上8位数据传输序列图:
{
uint32 bit;
int Status = 0;
*data=0;
IIC_SCL_LOW;
IIC_GPIO_SDA_CFG_INPUT;
IIc_Delay(50);
for(bit=0; bit<8; bit++)
{
IIC_Wait(5);
//set clock is high
IIC_SCL_HIGH;
//then clock is high get data for IIC
IIC_Wait(1);
(*data) = (*data)<<1;
if (IIC_SDA_VALUE&0x100)
{
(*data)=(*data) + 1;
}
IIC_Wait(4);
IIC_SCL_LOW;
}
return Status;
}
8-Bit Write Sequence:
8-Bit Read Sequence:
做了已经半年多了,因此有很多东西都记不清了,希望这次能够简单的总结一下!