上午刚写的一个I2C接口程序,新手有疑问我可以解答,高手的指导我耐心接受. 希望大家不要吝惜你的意见. (程序没调试过,这是我第一次用C语言写的接口程序.)
// ****************************************************************** typedef unsigned char bin08; // 8位无符号二进制码 #define I2C_DIR DIRA #define I2C_PORT PTA #define PSCL BIT1 #define PSDA BIT0 #define SCL_0 (I2C_PORT &= ~PSCL) #define SCL_1 (I2C_PORT |= PSCL) #define SCL_IN (I2C_DIR &= ~PSCL) #define SCL_OUT (I2C_DIR |= PSCL) #define SDA_0 (I2C_PORT &= ~PSDA) #define SDA_1 (I2C_PORT |= PSDA) #define SDA_IN (I2C_DIR &= ~PSDA) #define SDA_OUT (I2C_DIR |= PSDA)
void I2C_rec_ack ( ); bin08 I2C_rec_byte ( ); void I2C_send_ack ( ); void I2C_send_clk ( ); void I2C_send_byte (bin08); void I2C_start ( ); void I2C_stop ( );
void read_E2(bin08 E2_adr, bin08* RAM_adr, bin08 n) { I2Cerr=0; I2C_start(); // 启动I2C总线 I2C_send_byte(0xa0); // 发送设备写地址 I2C_rec_ack(); // 收应答信号 if(I2Cerr==0) { I2C_send_byte(E2_adr);// 发E2数据地址 I2C_rec_ack(); // 收应答信号 if(I2Cerr==0) { I2C_start(); // I2C总线重新开始 I2C_send_byte(0xa1);// 发送设备读地址 I2C_rec_ack(); // 收应答信号 if(I2Cerr==0) { while(1) { *RAM_adr = I2C_rec_byte(); // 读回一个字节 RAM_adr++; // RAM地址加1 n--; if(n==0) { I2C_send_clk(); break; } I2C_send_ack(); } } } } I2C_stop(); }
void write_E2(bin08 E2_adr, bin08* RAM_adr, bin08 n) { I2Cerr=0; I2C_start(); // 启动I2C总线 I2C_send_byte(0xa0); // 发送设备写地址 I2C_rec_ack(); // 收应答信号 if(I2Cerr==0) { I2C_send_byte(E2_adr);// 发E2数据地址 I2C_rec_ack(); // 收应答信号 if(I2Cerr==0) { for( ; n!=0; n-- ) { I2C_send_byte(*RAM_adr);// 发送一个字节 I2C_rec_ack(); // 读回 RAM_adr++; // RAM地址加1 } } } I2C_stop(); delay_mS(10); }
void I2C_rec_ack() { SDA_IN; delay_clk(); SCL_1; delay_clk(); if( I2C_PORT & PSDA ) { I2Cerr = 1; } SCL_0; delay_clk(); }
bin08 I2C_rec_byte() { bin08 i,I2C_data; SDA_IN; I2C_data = 0; for(i=8;i!=0;i--) { I2C_data <<= 1; SCL_1; delay_clk(); if( I2C_PORT & PSDA ) { I2C_data++; } SCL_0; delay_clk(); } return(I2C_data); }
void I2C_send_ack() { SDA_0; SDA_OUT; I2C_send_clk(); }
void I2C_send_clk() { SCL_1; delay_clk(); SCL_0; delay_clk(); }
void I2C_send_byte( bin08 I2C_data) { bin08 i; SDA_OUT; for(i=8;i!=0;i--) { if( I2C_data&0x80 ) { SDA_1; } else { SDA_0; } delay_clk(); I2C_send_clk(); I2C_data <<= 1; } }
void I2C_start ( ) { SDA_1; SDA_OUT; SCL_1; SCL_OUT; delay_clk(); SDA_0; delay_clk(); SCL_0; delay_clk(); } void I2C_stop( ) { SDA_OUT; SDA_0; delay_clk(); SCL_1; delay_clk(); SDA_1; delay_clk(); SDA_IN; SCL_IN; } 所有的错误与不足都改过来了,如果还能挑出毛病的那绝对是高手中的高手. |