内部集成总线 简单高效
1.在SCL为高电平期间,SDA由高到低跳变,表示传输开始。
函数实现:
void Start(void) /*START 启动I2C 总线子程序发送I2C 起始条件*/
{
SDA = 1; /* 发送起始条件的数据信号*/
_nop_();
SCL = 1; /*发送起始条件的时钟信号*/
_nop_(); /*起始条件建立时间大于4.7 s*/
SDA = 0; /*发送起始信号*/
_nop_(); /*起始条件锁定时间大于4 s*/
SCL = 0; /*钳住I2C 总线准备发送或接收数据*/
}
2.传输的第一个字节为地址,以选择不同的从设备。
3.之后以字节为单位传送数据,SCL为高电平期间采样,在此过程中,SDA上的电平不能有变化(否则会被看成是起始或者结束信号)。
在SCL为低电平期间,数据位才允许发生变化。
4.每字节数据传输完成后,发送方要释放SDA, 接收方要在第九个时钟期间发送一个ACK。
/*-----------发送应答位--------------------------------------------------*/
void SendACK()
{
SCL = 0;
_nop_();
SDA = 0;
_nop_();
SCL = 1;
_nop_();
SCL = 0;
}
/*------------发送非应答位-----------------------------------------------*/
void SendNoACK()
{
SCL = 0;
_nop_();
SDA = 1;
_nop_();
SCL = 1;
_nop_();
SCL = 0;
}
5.在SCL为高电平期间,SDA由低到高跳变,表示传输结束。
实现代码:
void Stop(void)
{
SDA = 0;
_nop_();
SCL = 1;
_nop_();
SDA = 1;
_nop_();
}