何志扬 发表于 2024-12-31 08:40:40

求助帖——软件屏幕I2C应答实验

书接上回
求助帖—如何使用擎天柱AI8051最小系统板驱动iic0.96OLED屏幕 - OLED12864,DMA-SPI/I2C 自动刷屏,GUI/U8g2,科学计算器,红外遥控 国芯技术交流网站 - AI32位8051交流社区

之后学习了I2C通信协议,想做一个应答实验,
初始化I2C-起始-发送从机地址-接收应答并分析-指定led灯亮灭
但是不能达到效果,想不通为啥应答信号总是高电平
屏幕芯片是1315,***从机地址为0x78(不确定)***,
芯片为擎天柱AI8051u
因为目的是20届智能车竞赛,使用逐飞开源库
以下是代码,随后附上源代码

#include "zf_common_headfile.h"
#define MyI2C_SCL IO_P21
#define MyI2C_SDA IO_P20
uint8 Ack;
void MyI2C_W_SCL(uint8 Bitvalue)
{
         gpio_set_level(MyI2C_SCL,Bitvalue);
         system_delay_us(10);
}
void MyI2C_W_SDA(uint8 Bitvalue)
{
         gpio_set_level(MyI2C_SDA,Bitvalue);
         system_delay_us(10);
}
uint8 MyI2C_R_SDA(void)
{
         uint8 Bitvalue;
         Bitvalue = gpio_get_level(MyI2C_SDA);
         return Bitvalue;
}
void MyI2C_Init(void)
{
      system_delay_us(200);
      gpio_init(MyI2C_SDA, GPO, 1, GPO_OPEN_DTAIN);
      gpio_init(MyI2C_SCL, GPO, 1, GPO_OPEN_DTAIN);   
}
void MyI2C_Start(void)
{
      MyI2C_W_SDA(1);
      MyI2C_W_SCL(1);
      MyI2C_W_SDA(0);
      MyI2C_W_SCL(0);
}
void MyI2C_Stop(void)
{
      MyI2C_W_SDA(0);
      MyI2C_W_SCL(1);
      MyI2C_W_SDA(1);
}
void MyI2C_SendByte(uint8 Byte)
{
      uint8 i;
      for(i= 0;i<8;i++)
      {
                if(Byte & (0x80 >> i) == 0) MyI2C_W_SDA(0);
                else MyI2C_W_SDA(1);
                MyI2C_W_SCL(1);
                MyI2C_W_SCL(0);
      }
}
uint8 MyI2C_ReceiveByte(void)
{
      uint8 i,Byte = 0x00;
      MyI2C_W_SDA(1);
      for(i = 0; i<8 ; i++)
      {
                MyI2C_W_SCL(1);
                if(MyI2C_R_SDA() == 1) {Byte |= (0x80 >> i);}
                MyI2C_W_SCL(0);
      }
      return Byte;
}
void MyI2C_SendAck(uint8 AckBit)
{
                MyI2C_W_SDA(AckBit);
                MyI2C_W_SCL(1);
                MyI2C_W_SCL(0);
}
uint8 MyI2C_ReceiveAck(void)
{
      uint8 AckBit;
      MyI2C_W_SDA(1);
      MyI2C_W_SCL(1);
      AckBit = MyI2C_R_SDA();
      MyI2C_W_SCL(0);
      return AckBit;
}


void main()
{
    clock_init(SYSTEM_CLOCK_40M);                              // 务必保留
      debug_init();                                                                // 务必保留

    // 此处编写用户代码 例如外设初始化代码等
      MyI2C_Init();
      MyI2C_Start();
      MyI2C_SendByte(0x78);
      Ack = MyI2C_ReceiveAck();
      MyI2C_Stop();
      
      if(Ack == 0)
      {
                gpio_set_level(IO_P24,0);
      }
      else if(Ack == 1)
      {
                gpio_set_level(IO_P25,0);
      }
      else
      {
                gpio_set_level(IO_P26,0);
      }

    while(1)
      {
               
                // 此处编写需要循环执行的代码
               
    }
}




接线及实验现象



乘风飞扬 发表于 2024-12-31 09:31:26

从机地址不确定是不是0x78的话,试试0x7A。
先保证发送从机地址能够收到ACK信号。

何志扬 发表于 2024-12-31 09:43:37

乘风飞扬 发表于 2024-12-31 09:31
从机地址不确定是不是0x78的话,试试0x7A。
先保证发送从机地址能够收到ACK信号。 ...

你好,还是不行
页: [1]
查看完整版本: 求助帖——软件屏幕I2C应答实验