I2C连续读写请教

2019-03-24 19:32发布

想通过I2C连续写数据和读数据,用for循环来操作,写入的都是第一个数据,后面的就没有写入了,读也是这样。但如果不用for循环写,直接写入两个数据可以实现,但是读得时候也不能实现;在网上搜了下也是用for循环啊,但是我的怎么不能实现呢?请大家指教下该怎么修改程序。 程序如下:    #include<reg52.h>  #include<intrins.h>  sbit SCL=P3^0;  sbit SDA=P3^1;  char tmp,i,*ap;  char code table[]={0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d };  void delay()  {;;}  void delay1()  {       char m,n;  for(m=0;m<100;m++)     for(n=0;n<100;n++);  }
 /*------I2C开始函数----------------*/    void start()  {       SDA=1;  _nop_();  SCL=1;  delay();  SDA=0;  delay();  //SCL=0;   可有可无  }
/*--------I2C停止函数-------*/
void stop() {      SDA=0; _nop_(); SCL=1; delay(); SDA=1; delay();
} /*------I2C OD门,初始化时要pull high*/
void init() {      SDA=1; delay(); SCL=1; delay(); }
/*-------I2C应答函数,应答信号在第九个时钟出现-----*/
void ACK(bit a) //  等候应答 {      if(a==0)SDA=0;    else SDA=1;      delay(); SCL=1;    delay(); SCL=0; delay(); SDA=1; //这里要释放SDA }


/*------host 向slave写数据--------*/
void writedata(char a) {      tmp=a; for(i=0;i<8;i++)   {        tmp<<=1;  //左移 D7移入CY,PSW.7 SCL=0; delay(); SDA=CY; delay(); SCL=1; delay();   } SCL=0;  //一定要先SCL=0,不然会又读SDA,这样先使SCL无效    SDA=1;   //释放SDA line .接收完数据后要释放,MCU准备读下一个应答位 delay(); }
/*----------host 读slave 数据-----*/
char readdata() {     char k; SCL=0; delay(); SDA=1; for(i=0;i<8;i++) { SCL=1; delay(); k=(k<<1)|SDA; SCL=0; delay(); }      SCL=0;//一定要先SCL=0,不然会又读SDA,这样先使SCL无效 SDA=1;   //释放SDA line .接收完数据后要释放,MCU准备读下一个应答位 delay(); return k; }
void main() {      ap=table;      init(); delay(); start(); writedata(0xa0);//device ID ,前四位固定,后三位可编程,D0表示读或写 ACK(0); writedata(3);      // 寄存器地址范围0~ 255 ACK(0); for(i=0;i<5;i++)    {    writedata(*ap); ACK(0); ap++; } stop();        delay1();
start(); writedata(0xa0);//device ID ,前四位固定,后三位可编程,D0表示读或写 ACK(0); writedata(3);       // 寄存器地址范围0~ 255 ACK(0); start(); writedata(0xa1);//device ID ,前四位固定,后三位可编程,D0表示读或写 ACK(0); for(i=0;i<5;i++)  {      P1=readdata();       if(i<4) ACK(0);    else ACK(1);     } stop();        while(1);        }    此帖出自小平头技术问答
0条回答

一周热门 更多>