C51和I2C模拟通讯
本文最后更新于20 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

起始条件

SCL高电平期间,SDA从高电平切换到低电平

 void I2C_Start(void)
 {
         SCL = 1;
         SDA = 1;
         SDA = 0;
         SCL = 0;
 }

终止条件

SCL高电平期间,SDA从低电平切换到高电平

 void I2C_Stop(void)
 {
         SCL = 1;
         SDA = 0;
         SDA = 1;
 }

发送一个字节

SCL低电平期间,主机将数据位依次放到SDA线上,然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即发送一个字节

 void I2C_SendByte(unsigned char Byte)
 {       
         unsigned char i = 0;
         for(i = 0; i < 8; i++ ) //循环8次
         {
                 SDA = Byte & (0x80 >> i);   //每一次循环取其中一位
                 SCL = 1;
                 SDA = 0;
         }
         
 }

接收一个字节

SCL低电平期间,从机将数据位依次放到SDA线上,然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前需要释放SDA)

 unsigned char I2C_ReceiveByte(void)
 {
         unsigned char i, Byte = 0x00;
     
         SDA = 1;
     
         for(i = 0; i < 8; i++ ) //循环8次
         {
                 SCL = 1;
                 if(SDA){Byte |= 0x80;};
                 SCL = 0;
         }
         
         return Byte;
 ​
 }

发送应答

在接收一个字节后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答

 void I2C_SendAck(unsigned char AckBit)
 {
         SDA = AckBit;
         SCL = 1;
         SCL = 0;
 }

接收应答

在发送完一个数据后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

 unsigned char I2C_ReceiveAck(void)
 {
         unsigned char AckBit;
         SDA = 1;    //释放SDA
         SCL = 1;
         AckBit = SDA;
         return AckBit;  
 }

AT24C02读写

AT24C02数据帧

AT24C02的设备地址有8bit组成,高4位为固定的1010,低4位由3位的设备地址1位的读写位组成

AT24C02的固定地址位1010,A0,A1,A2为高电平

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇