IIC总线原理
1 起始和终止都按时序图写他们的程序。
开始电平(建立>4.7us) 下降沿或上升沿(保持>4us) 之后电平(scl=0:为接受下一个数据做准备)
2对于不带回值得函数,应当定义为void类型,在此函数体中不得出现Return语句。
void I2cStart() 起始信号的模拟 { SDA=1; 初始条件,强制 Delay10us(); >4.7us SCL=1; 初始条件,建立时间使SDA保持时间>4.7us Delay10us();//建立时间是SDA保持时间>4.7us SDA=0; Delay10us();//保持时间是>4us SCL=0; Delay10us();
起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿 起始之后SDA和SCL都为0
2 void I2cStop() 由主控制器(有CPU的:单片机)主动建立的 { SDA=0; Delay10us(); SCL=1; Delay10us();//建立时间大于4.7us SDA=1; Delay10us(); }
终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿 结束之后保持SDA和SCL都为1;表示总线空闲
void Pcf8591SendByte(unsigned char channel) { I2cStart(); I2cSendByte(WRITEADDR);//发送写器件地址 I2cSendByte(0x40|channel);//发送控制寄存器 I2cStop(); }
在开始和停止条件之间从发送机传输到接收机的数据字节数是没有限制的
一个主控能控制信号的传输和时钟频率。如单片机置位和复位SDA和SCL来产生发送或接收数据的脉冲。单片机令SDA=1时,释放数据SDA,让别的器件来控制SDA
启动与停止
数据传输时:单片机令SCL=0,是为下一个数据的传送做准备。
SCL=1时,SDA要保持1或0不变,因为此时接收器正在读取数据
SCL=0时,允许SDA的电平发送改变,此时接收器不读取SDA上的数据 总线上每传送一位数据都有一个时钟脉冲与之对应(同步控制)
主控器给被控器发送应答信号
子函数中 :哪里有Return语句,哪里就是此函数的结束。
unsigned char I2cSendByte(unsigned char dat) (单片机向从接收器发送信息) { unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。 for(a=0;a<8;a++)//要发送8位,从最高位开始 { //起始信号之后SCL=0,所以可以直接改变SDA信号 ? SDA=dat>>7; 或 if((dat<4us Delay10us();//建立时间>4.7us SCL=0; Delay10us();//时间大于4us } SDA=1; Delay10us(); SCL=1; while(SDA)//等待应答,也就是等待从接收设备把SDA拉低,由从接收器发出 { b++; if(b>200) //如果超过200us没有应答发送失败,或者为从机不进行应答,非应答,表示接收结束 { SCL=0; Delay10us(); return 0; } } SCL=0; Delay10us(); return 1; }
数据从主控器(单片机)到从接收器
接收完一个字节之后产生应答,以便接着接收下一个字节 unsigned char I2cReadByte()
{ //起始和发送一个字节之后SCL都是0,让被控器给数据线发数据。 unsigned char a=0,dat=0; SDA=1; 置为高电平,释放这条线,让被控器控制这条线,给单片机发送数据。 Delay10us();(主机把SDA拉高,这样从机发高电平时,SDA为高,发低,为低) for(a=0;a<8;a++)//接收8个字节 , { (SCL=0;) SCL=0,SDA的电平允许发生改变,被控器可以给SDA发送数据 (Delay10us();) SCL=1,SDA的电平保持稳定.有效,主控器有效的读取SDA. SCL=1; 上面就是所谓的接收器读取SDA电平的同步时钟 Delay10us(); dat<<=1; 或dat=dat<<1; ? dat|=SDA; if(SDA==1) dat=dat+1; 从低位开始接收 dat=0000 0001…… Delay10us(); SCL=0; Delay10us();(给从机放数据到总线上的时间) }
SCL=0;置为低电平,为下一个数据的传送做准备。 return dat; }
主控器(单片机)接收数据
如果从发送器只有一个数据
接收完一个字节之后产生应答,以便接着接收下一个字节 接收完一个字节SCL=0 void I2cReadRespon()
{ 数据接收函数,数据发送函数 i2c启动函数在他们程序的最后都将SCL置为低电平, SDA=0; 目的是为下一个数据的传送做准备。 Delay10us(); SDA=1; Delay10us(); } 或
主控器进行应答信号(可以是应答或非应答信号,由参数a决定) Void ack-i2c(uchar a)
{ 说明SDA上的电平转变还是很快的。 if(a==0) SDA=0; Else SDA=1; Delay10us(); SCL=1;
Delay10us(); SCL=0;
Delay10us(); }
单片机应答
由于51单片机没有i2c总线控制器,所以只能通过单片机的普通端口,通过程序来模拟i2c的时序,来与i2c器件进行通信,用单片机的P2.0和P2.1来作为i2c总线的控制端
SPI总线原理
1.边沿读写操作:进行任何数据传输时,CE必须被置为高电平如果传送过程中CE置为0,则会中止此次数据传送。上升沿写入,下降沿读出,一次只能读写一位,通过八个脉冲便可以读写一个字节。
2.接收器不需要进行应答。
3.单片机要通过置0置1来模拟输入输出时钟, DS1392内部不会发出SCLK。
4.只有在SCLK为低电平时,才能将CE置为高电平。所以在进行操作之前先将SCLK置低电平,然后将CE置为高电平,接着开始在IO上面放入要传送的电平信号,然后跳变SCLK 5.SPI 6. 7. 8. 9. 10.
1.。DS1302是通过SPI串行总线跟单片机通信的,DS1302下降沿时,放置数据到IO口。 2.当进行一次读写操作时最少得读写两个字节,第一个字节是控制字节,就是一个命令,高速DS1302是读还是写操作,是对RAM还是对CLOK寄存器操作。第二个字节就是要读或写的数据了。
3.如果在传送过程中CE置为低电平,则会中止此次数据传送 4.共同:都是由主控器模拟时钟波形。
5.都是一位一位的传送,总线上每传送一位数据都有一个时钟脉冲与之对应(同步控制)。 6.都是只有一根串行数据进行双向通信。
相关推荐: