#include<pic.h> #define scl RA0 #define sda RA1 #define nop asm("nop") #define clrwdt asm("clrwdt")
char a1,a2,a3,a4,a5,a6,a7,a8,a9,aa,i,j,k;
void delay(); void delay_time(); void i2c_start(); void i2c_stop(); void i2c_write_byte(char data); void i2c_write(char add,char data); i2c_read_byte(); i2c_read(char add);
main() { i2c_write(0x11,0x11); i2c_write(0x12,0x22); i2c_write(0x13,0x33); i2c_write(0x14,0x44); i2c_write(0x15,0x55); i2c_write(0x16,0x66); i2c_write(0x17,0x77); i2c_write(0x18,0x88); i2c_write(0x19,0x99); i2c_write(0x1a,0xaa); delay_time(); delay_time(); delay_time(); delay_time(); delay_time(); delay_time(); a1=i2c_read(0x11); a2=i2c_read(0x12); a3=i2c_read(0x13); a4=i2c_read(0x14); a5=i2c_read(0x15); a6=i2c_read(0x16); a7=i2c_read(0x17); a8=i2c_read(0x18); a9=i2c_read(0x19); aa=i2c_read(0x1a); while(1) { nop; //设置断点,成功可到这 nop; clrwdt; } } //************************************* void delay_time() { char i; for(i=255;i>0;i--) { nop; } } //====================================== void delay() { char k; for(k=0xff;k>0;k--) { nop; } } //************************************* //I2C读写 //************************************* void i2c_start() { TRISA=0x00; sda=1; //发送起始条件的数据信号 delay(); //起始条件建立时间大于4.7us scl=1; delay(); sda=0; //发送起始信号 delay(); //起始条件锁定时间大于4μs scl=0; //钳住I2C总线,准备发送或接收数据 delay(); } //===================================== void i2c_stop() { TRISA=0x00; nop;nop; sda=0; //发送结束条件的数据信号 delay(); scl=1; //发送结束条件的时钟信号 delay(); //结束条件建立时间大于4μs sda=1; //发送I2C总线结束信号 delay(); scl=0; delay(); } //===================================== void i2c_write_byte(char temp) { char i; TRISA=0B00000000; delay(); for(i=8;i>0;i--) { if(temp&0x80) {sda=1;} else {sda=0;} delay(); scl=1; //置时钟线为高,通知被控器开始接收数据位 delay(); //保证时钟高电平周期大于4μs scl=0; delay(); sda=0; delay(); temp<<=1; } sda=1; //8位发送完后释放数据线,准备接收应答位 delay(); scl=1; delay(); TRISA=0B00000010; nop;nop; for(i=5;i>0;i--) { if(sda==0) {break;} else {nop;} //设置断点,失败断在这里。 } scl=0; delay(); //sda=0; //delay(); } //===================================== i2c_read_byte() { char i,data=0; TRISA=0B00000010; delay(); for(i=8;i>0;i--) { data<<=1; if(sda==1) {data|=0x01;} delay(); scl=1; delay(); scl=0; delay(); //sda=0; //delay(); } TRISA=0; delay(); sda=0; delay(); scl=1; delay(); scl=0; delay(); //sda=1; //delay(); return(data); } //===================================== void i2c_write(char add,char temp) { i2c_start(); delay_time(); i2c_write_byte(0xa0); delay_time(); i2c_write_byte(add); delay_time(); i2c_write_byte(temp); delay_time(); i2c_stop(); delay_time(); } //===================================== i2c_read(char add) { char temp; i2c_start(); delay_time(); i2c_write_byte(0xa0); delay_time(); i2c_write_byte(add); delay_time(); i2c_start(); delay_time(); i2c_write_byte(0xa1); delay_time(); temp=i2c_read_byte(); delay_time(); i2c_stop(); delay_time(); return (temp); } 发送81~8a的数据没有问题,发送现在的数据,第一个成功,以后都失败。 程序中//后部分试过没有影响。 |