/**************************实现函数******************************************** *函数原型:void iic_nack(void) *功 能:产生NACK应答 *******************************************************************************/ void iic_nack(void) { IIC_SCL_L(); SDA_OUT(); IIC_SDA_H(); delay_us(1); IIC_SCL_H(); delay_us(1); IIC_SCL_L(); }
u8 IIC_ReadBit(void) { u8 i,Temp=0; IIC_SDA_In(); for(i=0;i<8;i++) { IIC_SCL_L(); IIC_Delay(1); IIC_SCL_H(); Temp<<=1; if(IIC_SDA_Read()) Temp++; IIC_Delay(1); } IIC_SCL_L(); return Temp; }
/**************************实现函数******************************************** *函数原型:void iic_stop(void) *功 能:产生IIC停止信号 *******************************************************************************/ void iic_stop(void) { SDA_OUT(); //sda线输出 IIC_SCL_L(); IIC_SDA_L(); //STOP:when CLK is high DATA change form low to high delay_us(1); IIC_SCL_H(); IIC_SDA_H(); //发送I2C总线结束信号 delay_us(1); }
/**************************实现函数******************************************** *函数原型:void iic_start(void) *功 能:产生IIC起始信号 *******************************************************************************/ void iic_start(void) { SDA_OUT(); //sda线输出 IIC_SDA_H(); IIC_SCL_H(); delay_us(1); IIC_SDA_L(); //START:when CLK is high,DATA change form high to low delay_us(1); IIC_SCL_L(); //钳住I2C总线,准备发送或接收数据 }
/**************************实现函数******************************************** *函数原型:void iic_send_8bits(uint8_t txd) *功 能:IIC发送一个字节 *******************************************************************************/ void iic_send_8bits(uint8_t txd) { uint8_t t; SDA_OUT(); IIC_SCL_L(); //拉低时钟开始数据传输 for(t=0;t<8;t++) { if( txd & 0x80 ) IIC_SDA_H(); else IIC_SDA_L(); txd <<= 1; delay_us(1); IIC_SCL_H(); delay_us(1); IIC_SCL_L(); delay_us(1); } }
void IIC_WriteBit(u8 Temp) { u8 i; IIC_SDA_Out(); IIC_SCL_L(); for(i=0;i<8;i++) { if(Temp&0x80) { IIC_SDA_H(); } else { IIC_SDA_L(); } Temp<<=1; IIC_Delay(1); IIC_SCL_H(); IIC_Delay(1); IIC_SCL_L(); } }
/**************************实现函数******************************************** *函数原型:uint8_t iic_read_8bits(uint8_t ack) *功 能:读1个字节 * ack = SEND_ACK时,发送ACK * ack = SEND_NACK时,发送NACK *******************************************************************************/ uint8_t iic_read_8bits(uint8_t ack) { uint8_t i,receive = 0; SDA_IN(); //SDA设置为输入 for(i=0;i<8;i++ ) { IIC_SCL_L(); delay_us(1); IIC_SCL_H(); receive <<= 1; if(READ_SDA) receive++; __NOP(); } if (ack) iic_ack(); //发送ACK else iic_nack(); //发送nACK return receive; }
/* void IIC_Start(void) { IIC_SDA_Out(); IIC_SDA_H(); IIC_SCL_H(); IIC_Delay(1); IIC_SDA_L(); IIC_Delay(1); IIC_SCL_L(); } void IIC_Stop(void) { IIC_SDA_Out(); IIC_SCL_L(); IIC_SDA_L(); IIC_Delay(1); IIC_SCL_H(); IIC_SDA_H(); IIC_Delay(1); } void IIC_Ack(u8 re) { IIC_SDA_Out(); if(re) IIC_SDA_H(); else IIC_SDA_L(); IIC_SCL_H(); IIC_Delay(1); IIC_SCL_L(); IIC_Delay(1); } */ int IIC_WaitAck(void) { u16 Out_Time=1000; IIC_SDA_H(); IIC_SDA_In(); IIC_Delay(1); IIC_SCL_H(); IIC_Delay(1); while(IIC_SDA_Read()) { if(--Out_Time) { IIC_Stop(); printf("error 2A\r\n"); return 0xff; } } IIC_SCL_L(); return 0; }
/**************************实现函数******************************************** *函数原型:uint8_t iic_wait_ack(void) *功 能:等待应答信号到来 *返 回 值:DEBUG_ACK_TIMEOUT,接收应答失败 * DEBUG_SUCCESS,接收应答成功 *******************************************************************************/ uint8_t iic_wait_ack(void) { uint8_t ucErrTime=0; SDA_IN(); //SDA设置为输入 IIC_SDA_H(); delay_us(1); IIC_SCL_H(); delay_us(1); while(READ_SDA) { ucErrTime++; if(ucErrTime>100) { iic_stop(); ack_timeout_cnt++; return IIC_ACK_TIMEOUT; } delay_us(1); } IIC_SCL_L(); //时钟输出0 ack_success_cnt++; return IIC_SUCCESS; }