IIC协议理解及驱动OLED屏

1.iic协议是串行半双工总线,主要应用于近距离,低速芯片之间通信。

两根线 SCL SDA

2.IIC总线通讯过程

1.主机发送起始信号占用总线

2.主机发送一个字节数据指明从机地址和后续字节的传输方向。

七位地址位+一位来调节后续字节传输方向

最后一位:0  主机发送

最后一位:1  主机接收

3.被寻址的从机发送应答信号回应主机

4.发送器发送一字节数据

5.接收器发送应答信号回应发送器

注意这两部是发送器和接收器  不再是主机从机。至于发送器和接收器取决于 第二步最后一位是0还是1,如果是主机发送,发送器是主机,应答器是从,如果是主机接收,发送器是从机,应答器是主机。

6.通信完成后发送停止信号

1.起始信号

void IIC_Start()
{
    IIC_setSDAMode_Out();
    
    IIC_SDA_OUT(1);                             //总线释放状态
    IIC_SCL_OUT(1);
    delay_us(5);
  
    IIC_SDA_OUT(0);                             //SDA跳变为低电平
    delay_us(5);
   
    IIC_SCL_OUT(0);                              //钳住iic总线
    delay_us(5);



}

 最后将scl拉低是为了钳住iic总线,因为iic规定scl为低,发送信号,scl为高,接收信号。

2.停止信号

void IIC_Stop()
{
    IIC_setSDAMode_Out();
    
    IIC_SDA_OUT(0);          
    IIC_SCL_OUT(0);
    delay_us(5);
  
    IIC_SCL_OUT(1);                              //SDA跳变为高电平
    delay_us(5);
  
    IIC_SDA_OUT(1);        
    delay_us(5);

}

3.应答信号

标注部分为应答信号,在第九个周期,先将时钟线拉高,然后判断sda线的状态。

代码实现

u8 IIC_waitAck(){    u8 ack =0;  IIC_setSDAMode_In();  IIC_SCL_OUT(0);             //准备时序  delay_us(5);  IIC_SCL_OUT(1);  delay_us(5);  if(IIC_SDA_IN)  {        ack =1;  }  else  {        ack =0;    }  IIC_SCL_OUT(0);              //拉低,表示应答完成  delay_us(5);  return  ack;}

iic驱动OLED 屏幕显示结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值