打印
[技术问答]

关于新唐M051驱动OLED使用硬件I2C的OLED_WR_byte写字节函数

[复制链接]
778|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LivinLie|  楼主 | 2020-7-14 15:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是新手小白,主要是刚接触这类单片机,下面的函数主要是模仿调用EEPORM的函数写的,进行调试的时候,运行到前几步就停止运行了,不知道原因是啥!有没有大佬指导一下!


#define OLED_ADD 0X78

#define OLED_CMD    0
#define OLED_DATA   1

void OLED_WR_Byte(u8 data, u8 mode)
{
    int8_t i8;

   do
    {
       i8 = 0;
         I2C_START(I2C0);
        I2C_WAIT_READY(I2C0);
        
        if(I2C_GET_STATUS(I2C0) == 0x08)
        {
           I2C_SET_DATA(I2C0,OLED_ADD);
           I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
           I2C_WAIT_READY(I2C0);
           
            if(mode)
             I2C_SET_DATA(I2C0,0x40);
            else
            I2C_SET_DATA(I2C0,0x00);

            if(I2C_GET_STATUS(I2C0) == 0x18)
            {
               I2C_SET_DATA(I2C0, data);
               I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_SI);
               I2C_WAIT_READY(I2C0);
               
              if(I2C_GET_STATUS(I2C0) == 0x28)  
              {
                  I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STO | I2C_I2CON_SI);
              }  
              else
              {
                      i8 = 3;//发送数据错误
               }
             }
             else
             {
                     i8 = 2;//发送地址错误
              }
        }
        else
        {
               i8 = 1;//发送控制位错误
         }
      
         if(i8)
        {
            I2C_SET_CONTROL_REG(I2C0, I2C_I2CON_STO | I2C_I2CON_SI);
            CLK_SysTickDelay(100);
        }
    }

   while(i8);

}

使用特权

评论回复
沙发
zuiainideren| | 2020-7-15 11:20 | 只看该作者
卡在哪一步了?

使用特权

评论回复
评论
LivinLie 2020-7-15 15:36 回复TA
卡在了第一个if语句之前,按照道理说,硬件I2C发送开始信号,状态标志位就直接到0x08了吧!!!! 
板凳
jasontu| | 2020-7-15 14:42 | 只看该作者
建议使用示波器或逻辑分析仪。

使用特权

评论回复
评论
LivinLie 2020-7-15 15:37 回复TA
怎么查看? 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝