|
本帖最后由 kennan 于 2011-3-10 08:52 编辑
其实也可以换一种思路来实现IIC。
举例:
以下是IIC控制端口的寄存器初始化
IIC_PORT_SEL &= ~(IIC_SCL + IIC_SDA); //用来模拟IIC总线端口的这两根线选择GPIO功能;
IIC_PORT_DIR &= ~(IIC_SCL + IIC_SDA); //这两根线先弄成输入形式;
IIC_PORT &= ~(IIC_SCL + IIC_SDA); ;//这两根线所对应的寄存器位置0
IIC_PORT_INP |= (IIC_SDA + IIC_SCL); ;//这两个端口输入的时候采用三态方式
以下是IIC总线那两根线输出高电平和低电平的实现
#define SCL_LOW() IIC_PORT_DIR |= IIC_SCL //SCL置低电平
#define SCL_HIGH() IIC_PORT_DIR &= ~IIC_SCL //SCL置高电平
#define SDA_LOW() IIC_PORT_DIR |= IIC_SDA //SDA置低电平
#define SDA_HIGH() IIC_PORT_DIR &= ~IIC_SDA //SDA置高电平
具体原理:因为IIC总线需要在SCL和SDA线接上拉电阻的,(以SCL线为例)所以当SCL设置成输入方式时,这根线因为上拉电阻的原因,就是高电平,当SCL设置成输出方式的时候,因为事先已经初始化了端口寄存器是低电平,所以该端口输出0,也就是说,通过更改PORT_DIR的方式就可以实现IIC总线读写了。这个过程,当你要读SDA线的时候,这个端口按照iic 的规范就应该是高电平的,而此时端口方向也正是输入方式,直接读就可以了。 |
|