请教前辈一个I2C程序,帮我我看看
时间:10-02
整理:3721RD
点击:
点不亮LED
- #include<reg52.h>
- #include<intrins.h>
- #define _nop() _nop_()
- #define uchar unsigned char
- sbit sda=P2^2;
- sbit scl=P2^3;
- bit ack;
- void delayus(uchar t);
- void delayms(uchar t);
- void delayus(uchar t)
- {
- while(--t);
- }
- void delayms(uchar t)
- {
- while(t--)
- {
- delayus(245);
- delayus(245);
- }
- }
- void start()
- {
- sda=1;
- _nop();
- scl=1;
- _nop();
- _nop();
- _nop();
- _nop();
- _nop();
- sda=0;
- _nop();
- _nop();
- _nop();
- _nop();
- _nop();
- scl=0;
- _nop();
- _nop();
- }
- void stop()
- {
- sda=0;
- _nop();
- _nop();
- scl=1;
- _nop();
- _nop();
- _nop();
- _nop();
- _nop();
- sda=1;
- _nop();
- _nop();
- _nop();
- _nop();
- _nop();
- }
- void ACK_T(void)
- {
- sda=0;
- _nop();
- _nop();
- _nop();
- scl=1;
- _nop();
- _nop();
- _nop();
- _nop();
- _nop();
- scl=0;
- _nop();
- _nop();
- }
- void NOACK(void)
- {
- sda=1;
- _nop();
- _nop();
- _nop();
- scl=1;
- _nop();
- _nop();
- _nop();
- _nop();
- _nop();
- scl=0;
- _nop();
- _nop();
- }
- void write(uchar c)
- {
- uchar i,temp;
- temp=c;
- scl=0;
- for(i=0;i<8;i++)
- {
- temp=temp<<1;
- sda=CY;
- _nop();
- scl=1;
- _nop();
- _nop();
- _nop();
- _nop();
- _nop();
- scl=0;
- }
- _nop();
- _nop();
- sda=1;
- _nop();
- _nop();
- scl=1;
- _nop();
- _nop();
- _nop();
- if(sda==0)ack=0;
- else ack=1;
- scl=0;
- _nop();
- _nop();
- }
- unsigned char read()
- {
- unsigned char i;
- uchar j;
- uchar k;
- scl=0;
- for(i=0;i<8;i++)
- {
- j=sda;
- k=(k<<1)|j;
- scl=1;
- _nop();
- _nop();
- _nop();
- _nop();
- _nop();
- scl=0;
- _nop();
- _nop();
- }
- scl=0;
- _nop();
- _nop();
- return (k);
- }
- bit write_string(uchar duxie,uchar dizhi,uchar *s,uchar geshu )
- {
- uchar b;
- start();
- write(duxie);
- if(ack==0)return(0);
- write(dizhi);
- if(ack==0)return(0);
- for(b=0;b<geshu;b++)
- {
- write(*s);
- if(ack==0)return(0);
- s++;
- }
- stop();
- return(1);
- }
- bit read_string(uchar duxie,uchar dizhi,uchar *s,uchar geshu )
- {
- uchar b;
- start();
- write(duxie);
- if(ack==0)return(0);
- write(dizhi);
- if(ack==0)return(0);
- for(b=0;b<geshu;b++)
- {
- *s=read();
- ACK_T();
- s++;
- }
- *s=read();
- NOACK();
- stop();
- return(1);
- }
- void main()
- {
- uchar a;
- a=0xaa;
- write_string(0xae,80,&a,1);
- delayus(1000);
- read_string(0xaf,80,&a,1);
- while(1)
- {
- P1=a;
- }
- }
问题一:起始信号,结束信号不完整。
问题二:写的时候等待从机应答时间过短
读的时候应该在时钟的下降沿的时候读