#include "user_iic.h" /*时钟线SCL高电平时,拉低数据线SDA-------------启动 时钟线SCL高电平时,拉高数据线SDA-------------停止*/ //产生IIC起始信号 void IIC_Start(void) { IIC_SDA_1(); IIC_SCL_1(); delay_us(4); IIC_SDA_0();//START:when CLK is high,DATA change form high to low delay_us(4); IIC_SCL_0();//钳住I2C总线,准备发送或接收数据 } //产生IIC停止信号 void IIC_Stop(void) { IIC_SCL_0(); IIC_SDA_0(); delay_us(4); IIC_SCL_1(); IIC_SDA_1(); delay_us(4); } //等待应答信号到来 //返回值:1,接收应答失败 // 0,接收应答成功 uint8_t IIC_Wait_Ack(void) { uint8_t ucErrTime=0; IIC_SDA_1();delay_us(1); IIC_SCL_1();delay_us(1); while(READ_SDA()) { ucErrTime++; if(ucErrTime>100) { IIC_Stop(); return 1; } } IIC_SCL_0();//时钟输出0 return 0; } //产生ACK应答 void IIC_Ack(void) { IIC_SCL_0(); IIC_SDA_0(); delay_us(2); IIC_SCL_1(); delay_us(2); IIC_SCL_0(); IIC_SDA_1(); } //不产生ACK应答 void IIC_NAck(void) { IIC_SCL_0(); IIC_SDA_1(); delay_us(4); IIC_SCL_1(); delay_us(4); IIC_SCL_0(); IIC_SDA_1(); } //IIC发送一个字节 //返回从机有无应答 //1,有应答 //0,无应答 void IIC_Send_Byte(uint8_t txd) { uint8_t t; IIC_SCL_0();//拉低时钟开始数据传输 for(t=0;t<8;t++) { if((txd&0x80)>>7) { IIC_SDA_1(); } else { IIC_SDA_0(); } txd<<=1; delay_us(2); //对TEA5767这三个延时都是必须的 IIC_SCL_1(); delay_us(2);; IIC_SCL_0(); delay_us(2); } } //读1个字节,ack=1时,发送ACK,ack=0,发送nACK //返回读取的字节 uint8_t IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; for(i=0;i<8;i++ ) { IIC_SCL_0(); delay_us(2); IIC_SCL_1(); receive<<=1; if(READ_SDA())receive++; delay_us(1); } if (!ack) IIC_NAck();//发送nACK else IIC_Ack(); //发送ACK return receive; }