char MOD_IO2::ReadSingle( char ack ) { char data = 0, i; SDA_IN(); for(i = 0; i < 8; i++) { WaitMicrosecond(1000); SCL_IN(); while(digitalRead(pinSCL)==0); WaitMicrosecond(1000); data |= digitalRead(pinSDA); if( i!=7 ) data<<=1; WaitMicrosecond(1000); SCL_OUT(); WaitMicrosecond(1000); } // send the ACK/NACK WaitMicrosecond(1000); if(ack) SDA_IN(); else SDA_OUT(); WaitMicrosecond(1000); SCL_IN(); WaitMicrosecond(1000); SCL_OUT(); WaitMicrosecond(1000); return data; }
u8 IIC_Wait_Ack1(void) { u8 i; IIC_SCL=1; delay_us(2); IIC_SCL=0; SDA_OUT(); IIC_SDA = 1; delay_us(2); IIC_SDA = 0; delay_us(1); IIC_SCL = 1; IIC_SDA = 1; delay_us(10); // for (i=0; i<100; i++) // { // SDA_IN(); // if (READ_SDA == 1){ // // if data line is low, pulse the clock. // delay_us(10); // return 0; // } // } // IIC_SCL=1; return 1; }
void MOD_IO2::Start() { SDA_OUT(); WaitMicrosecond(1000); SCL_OUT(); WaitMicrosecond(1000); }
/*---------------------------------------------------------------------------*/ static unsigned sread(int send_ack) { int i; unsigned char c = 0x00; SDA_1(); SDA_IN(); for(i = 0; i < 8; i++) { c <<= 1; SCL_1(); delay_400ns(); if(SDA_IS_1) { c |= 0x1; } SCL_0(); } SDA_OUT(); if(send_ack) { SDA_0(); } SCL_1(); delay_400ns(); SCL_0(); SDA_1(); /* Release SDA */ SDA_IN(); return c; }
void i2c_pic_start(void) { // PIC chip requires a special double start condition in order // to initiate communication. This is to insure the PIC does not // read any false starts. // MDF 12/01/04 // 1st start condition // SDA_OFF; // _delay_loop_2(250); // SCL_OFF; // _delay_loop_2(200); delay_us(100); SDA_OUT(); //sda线输出 IIC_SDA = 0; delay_us(100); IIC_SCL = 0; delay_us(100); // reset bus // SDA_ON; // SCL_ON; // _delay_loop_2(200); IIC_SDA = 1; delay_us(100); IIC_SCL = 1; delay_us(100); // 2nd start condition // SDA_OFF; // _delay_loop_2(200); // SCL_OFF; IIC_SDA = 0; delay_us(100); IIC_SCL = 0; }
/******************************************************************************* **函 数: IIC_InitPort **功 能: IIC接口初始化 **参 数: void **返 回: void *******************************************************************************/ void IIC_InitPort(void) { printf("\n BL5372 IIC Port Init"); // Init IIC_1_SCL_PIN gpio_init(&gpio_iic_1_scl, IIC_1_SCL_PIN); gpio_dir(&gpio_iic_1_scl, PIN_OUTPUT); // Direction: Output gpio_mode(&gpio_iic_1_scl, PullNone); // No pull gpio_write(&gpio_iic_1_scl, 1); // Init IIC_1_SDA_PIN gpio_init(&gpio_iic_1_sda, IIC_1_SDA_PIN); gpio_dir(&gpio_iic_1_sda, PIN_OUTPUT); // Direction: Output gpio_mode(&gpio_iic_1_sda, PullNone); // No pull gpio_write(&gpio_iic_1_sda, 1); SDA_OUT(); SCL_OUT(); SCL1; SDA1; }
char MOD_IO2::WriteSingle( char data ) { char i; // Send the 8 bits for(i = 0; i<8; i++) { WaitMicrosecond(1000); if(data&RW_MASK) SDA_IN(); else SDA_OUT(); data <<= 1; WaitMicrosecond(1000); SCL_IN(); WaitMicrosecond(1000); SCL_OUT(); } // Read the ACK WaitMicrosecond(1000); SDA_IN(); WaitMicrosecond(1000); SCL_IN(); WaitMicrosecond(1000); i = digitalRead(pinSDA); SCL_OUT(); WaitMicrosecond(1000); return i; }
void MOD_IO2::Stop() { SDA_OUT(); WaitMicrosecond(1000); SCL_IN(); WaitMicrosecond(1000); SDA_IN(); WaitMicrosecond(1000); }
MOD_IO2::MOD_IO2 (unsigned char Address, unsigned char nSDA, unsigned char nSCL) { SL_READ = (Address<<1) | 1; SL_WRITE = (Address<<1) | 0; pinSDA = nSDA; pinSCL = nSCL; SCL_OUT(); SDA_OUT(); }
static void IIC_Stop(void) { SDA_OUT(); IIC_SDA(0); IIC_SCL(1); delay_us(4); IIC_SDA(1); delay_us(4); }
//产生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(); }
//不产生ACK应答 static void IIC_NAck(void) { SDA_OUT(); IIC_SDA(1); IIC_SCL(1); I2C_delay(); IIC_SCL(0); I2C_delay(); }
//不产生ACK应答 void I2C_NAck(void) { I2C_SCL=0; SDA_OUT(); I2C_SDA=1; Delay_NOP_us(2); I2C_SCL=1; Delay_NOP_us(2); I2C_SCL=0; }
/**************************实现函数******************************************** *函数原型: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_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(); }
//不产生ACK应答 void IIC_NAck(void) { SDA_OUT(); IIC_SCL=0; 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); }
//产生ACK应答 void IIC_Ack(void) { IIC_SCL=0; SDA_OUT(); IIC_SDA=0; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; }
/**************************实现函数******************************************** *函数原型: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总线,准备发送或接收数据 }
//产生IIC起始信号 void IIC_Start(void) { SDA_OUT(); //sda线输出 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) { SDA_OUT();//sda线输出 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;//发送I2C总线结束信号 delay_us(4); }
/**************************实现函数******************************************** *函数原型: void IIC_NAck(void) *功 能: 产生NACK应答 *******************************************************************************/ void IIC_NAck(void) { IIC_SCL=0; SDA_OUT(); IIC_SDA=1; delay_us(1); IIC_SCL=1; delay_us(1); IIC_SCL=0; }
//不产生ACK应答 void myiic_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_NAck(void) { IIC_SCL(0); SDA_OUT(); IIC_SDA(1); delay_us(2); IIC_SCL(1); delay_us(2); 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 ; }
/* ********************************************************************************************************* * 函 数 名: i2c_Start * 功能说明: CPU发起I2C总线停止信号 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void i2c_Stop(void) { SDA_OUT(); //sda线输出 /* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */ I2C_SCL_0(); I2C_SDA_0(); i2c_Delay(); I2C_SCL_1(); I2C_SDA_1(); i2c_Delay(); }
//---------------------------------------------------------------------------------- char s_read_byte(unsigned char ack) //---------------------------------------------------------------------------------- // reads a byte form the Sensibus and gives an acknowledge in case of "ack=1" { unsigned char i,val=0; SDA_OUT(1); //release DATA-line for (i=0x80;i>0;i=i>>1) //shift bit for masking { SCL_OUT(1); //clk for SENSI-BUS if (SDA_READ()) val=(val | i); //read bit SCL_OUT(0); } SDA_OUT(!ack); //in case of "ack==1" pull down DATA-Line delay_us(2); //observe setup time SCL_OUT(1); //clk #9 for ack delay_us(6); //pulswith approx. 5 us SCL_OUT(0); delay_us(2); //observe hold time SDA_OUT(1); //release DATA-line return val; }
/* ********************************************************************************************************* * 函 数 名: i2c_Start * 功能说明: CPU发起I2C总线启动信号 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void i2c_Start(void) { SDA_OUT(); //sda线输出 /* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */ I2C_SDA_1(); I2C_SCL_1(); i2c_Delay(); I2C_SDA_0(); i2c_Delay(); I2C_SCL_0(); i2c_Delay(); }
/* ********************************************************************************************************* * 函 数 名: i2c_NAck * 功能说明: CPU产生1个NACK信号 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void i2c_NAck(void) { I2C_SCL_0(); SDA_OUT(); I2C_SDA_1(); /* CPU驱动SDA = 1 */ i2c_Delay(); I2C_SCL_1(); /* CPU产生1个时钟 */ i2c_Delay(); I2C_SCL_0(); i2c_Delay(); }
/**************************实现函数******************************************** *函数原型: void IIC_Start(void) *功 能: 产生IIC起始信号 *******************************************************************************/ int IIC_Start(void) { SDA_OUT(); //sda线输出 IIC_SDA=1; if(!READ_SDA)return 0; IIC_SCL=1; delay_us(1); IIC_SDA=0;//START:when CLK is high,DATA change form high to low if(READ_SDA)return 0; delay_us(1); IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 return 1; }