void IIC_Read_Byte(unsigned char ack,unsigned char *data) { unsigned char i; unsigned char receive=0; SDA_IN(); for(i=0; i<8; i++) { IIC_SCL(0); delay_us(2); IIC_SCL(1); receive <<= 1; if(READ_SDA)receive++; delay_us(1); } *data = receive; if (!ack) IIC_NAck(); else IIC_Ack(); }
uint8_t IIC_Wait_Ack(void) { uint8_t ucErrTime = 0; SDA_IN(); IIC_SDA(1); delay_us(1); IIC_SCL(1); delay_us(1); while(READ_SDA) { ucErrTime++; if(ucErrTime>250) { IIC_Stop(); return 1; } } IIC_SCL(0); return 0; }
//不产生ACK应答 static void IIC_NAck(void) { SDA_OUT(); IIC_SDA(1); IIC_SCL(1); I2C_delay(); IIC_SCL(0); I2C_delay(); }
static void IIC_NAck(void) { IIC_SCL(0); SDA_OUT(); IIC_SDA(1); delay_us(2); IIC_SCL(1); delay_us(2); IIC_SCL(0); }
static void IIC_Stop(void) { SDA_OUT(); IIC_SCL(0); IIC_SDA(0);//STOP:when CLK is high DATA change form low to high delay_us(4); IIC_SCL(1); IIC_SDA(1); delay_us(4); }
static void IIC_Start(void) { SDA_OUT(); IIC_SDA(1); IIC_SCL(1); delay_us(4); IIC_SDA(0); delay_us(4); IIC_SCL(0); }
//产生IIC起始信号 static bool IIC_Start(void) { SDA_OUT(); //sda线输出 IIC_SDA(1); IIC_SCL(1); I2C_delay(); IIC_SDA(0);//START:when CLK is high,DATA change form high to low I2C_delay(); IIC_SCL(0);//钳住I2C总线,准备发送或接收数据 return TRUE ; }
//IIC发送一个字节 //返回从机有无应答 //1,有应答 //0,无应答 static void IIC_Send_Byte(u8 txd) { u8 t; SDA_OUT(); for(t=0;t<8;t++) { IIC_SDA((txd&0x80)>>7); txd<<=1; IIC_SCL(1); I2C_delay(); IIC_SCL(0); I2C_delay(); } }
//等待应答信号到来 //返回值:FALSE,接收应答失败 // TRUE,接收应答成功 static bool IIC_Wait_Ack(void) { SDA_IN(); //SDA设置为输入 IIC_SCL(1); I2C_delay(); if(READ_SDA) { IIC_SCL(0); I2C_delay(); return FALSE; } IIC_SCL(0);//时钟输出0 I2C_delay(); return TRUE; }
//产生IIC停止信号 static void IIC_Stop(void) { SDA_OUT();//sda线输出 IIC_SDA(0);//STOP:when CLK is high DATA change form low to high IIC_SCL(1); I2C_delay(); IIC_SDA(1);//发送I2C总线结束信号 I2C_delay(); }
static void IIC_Send_Byte(uint8_t txd) { uint8_t t; SDA_OUT(); IIC_SCL(0); for(t=0; t<8; t++) { IIC_SDA((txd&0x80)>>7); txd<<=1; delay_us(2); IIC_SCL(1); delay_us(2); IIC_SCL(0); delay_us(2); } }
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK static u8 IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; IIC_SDA(1); SDA_IN();//SDA设置为输入 for(i=0;i<8;i++ ) { receive<<=1; IIC_SCL(1); I2C_delay(); if(READ_SDA)receive |= 0x01; IIC_SCL(0); I2C_delay(); } if (ack) IIC_Ack(); //发送ACK else IIC_NAck();//发送nACK return receive; }
void I2C_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(IIC_GPIO_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN | IIC_SDA_PIN;// 配置 CLK 和 SDA GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//GPIO_Mode_Out_PP;// //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//GPIO_Speed_50MHz; GPIO_Init(IIC_GPIO, &GPIO_InitStructure); GPIO_SetBits(IIC_GPIO,IIC_SCL_PIN | IIC_SDA_PIN); IIC_SCL(1);//空闲时总线为高 IIC_SDA(1); }
static void IIC_Send_Byte(uint8_t txd) { uint8_t t; SDA_OUT(); IIC_SCL(0); for(t=0;t<8;t++) { //IIC_SDA=(txd&0x80)>>7; if((txd&0x80)>>7) { IIC_SDA(1); } else { IIC_SDA(0); } txd<<=1; delay_us(2); IIC_SCL(1); delay_us(2); IIC_SCL(0); delay_us(2); }
static void IIC_Init(void) { IIC_SCL(1); IIC_SDA(1); port_get_config_defaults(&pin_clk); pin_clk.direction = PORT_PIN_DIR_OUTPUT; port_pin_set_config(PIN_I2C_CLK, &pin_clk); port_pin_set_output_level(PIN_I2C_CLK, 1); port_get_config_defaults(&pin_data); pin_data.direction = PORT_PIN_DIR_OUTPUT; port_pin_set_config(PIN_I2C_DATA, &pin_clk); port_pin_set_output_level(PIN_I2C_DATA, 1); }