strait 发表于 2025-6-18 17:11:09

AI8H8K64U I2C接口电平问题

准备用 AI8H8K64U 的I2C接口(21:SCL_4;22:SDA_4管脚)
来控制显示模块HS91L02W2C01.
现在有个控制电平问题,请教各位大神:
AI8H8K64U用的5V电源;
而显示模块HS91L02W2C01的数据手册中有如下表述:

显示模块电源电压最高5V(我在设计中用5V串了一个二极管稍微降压到4.4V左右);
SCL,SDA的最高逻辑电平为3.3V。

请问其I2C管脚是否能直接连接? 还是需要电平转换电路?
可否有推荐的样本电路参考? 谢谢!

另外,我看数据手册里面有



可否参考这个电路?
但是这样就在板子上增加一个3.3V电源,也有够烦的

神农鼎 发表于 2025-6-18 23:07:20

STC8H8K64U 是宽电压芯片,可以使用和显示模块一样的电压;
STC8H8K64U的 I2C 接口 设置为开漏工作模式;
显示模块的I2C 应有外部上拉电阻,或其芯片内部有上拉电阻





DebugLab 发表于 2025-6-18 23:58:11

查找资料发现是OLED 128*32,建议统一用3.3V

128*32建议使用SSD1316的
void SSD1316_Clear(void)
{
      unsigned char i,n;                  
      for(i=0;i<4;i++)
      {
                SSD1316_Write_CMD(0xb0+i);      //设置页地址(0~3)
                SSD1316_Write_CMD(0x00);      //设置显示位置—列低地址
                SSD1316_Write_CMD(0x10);      //设置显示位置—列高地址
                SSD1316_Write_DATA_A();               
                for(n=0;n<128;n++)
                {
                        SSD1316_Write_DATA_B(0x00);
                }
                SSD1316_Write_DATA_C();
      }
}

void SSD1316_Display_16x32(unsigned char x,unsigned char dat)      //x=0~112,dat=0~17
{
      unsigned char i;
      SSD1316_Write_CMD(0x20);      //Set Memory Addressing Mode(设置内存寻址模式)
      SSD1316_Write_CMD(0x01);      //0x01(垂直寻址模式)
      SSD1316_Write_CMD(0x21);      //Set Column Address(设置列地址)
      SSD1316_Write_CMD(x);                //(列开始地址)
      SSD1316_Write_CMD(x+15);      //(列结束地址)
      SSD1316_Write_CMD(0x22);      //Set Page Address(设置页地址)
      SSD1316_Write_CMD(0x00);      //0
      SSD1316_Write_CMD(0x03);      //3
      SSD1316_Write_DATA_A();
      for(i=0;i<64;i++)
      {
                SSD1316_Write_DATA_B(ASCII);
      }
      SSD1316_Write_DATA_C();
      SSD1316_Write_CMD(0x20);      //Set Memory Addressing Mode(设置内存寻址模式)
      SSD1316_Write_CMD(0x02);      //0x02(页寻址模式)
}

void OLED_Set_Pos(unsigned char x,unsigned char y)
{
      SSD1316_Write_CMD(0xb0+y);
      SSD1316_Write_CMD(((x&0xf0)>>4)|0x10);
      SSD1316_Write_CMD((x&0x0f));
}

void OLED_DrawBMP(unsigned char x,unsigned char y,unsigned char sizex, unsigned char sizey,unsigned char BMP[])
{         
      unsigned int j=0;
      unsigned char i,m;
      sizey=sizey/8+((sizey%8)?1:0);
      for(i=0;i<sizey;i++)
      {
                OLED_Set_Pos(x,i+y);
                SSD1316_Write_DATA_A();
                for(m=0;m<sizex;m++)
                {
                        SSD1316_Write_DATA_B(BMP);
                }
                SSD1316_Write_DATA_C();
      }
}

void SSD1316_Init(void)
{
      SSD1316_Write_CMD(0xAE);      //Set Display OFF(设置显示关)
      SSD1316_Write_CMD(0xA1);      //Set Segment Remap(设置列重映射)
      SSD1316_Write_CMD(0xA8);      //Set Multiplex Ratio(设置行通道数)
      SSD1316_Write_CMD(0x1F);      //31
//      SSD1316_Write_CMD(0xC8);      //Set COM Output Scan Direction(设置行重映射)
      SSD1316_Write_CMD(0xD3);      //Set Display Offset(设置垂直偏移量)
      SSD1316_Write_CMD(0x00);      //0
      SSD1316_Write_CMD(0xD5);      //Set Display Clock Divide Ratio/Oscillator Frequency(设置显示时钟分频器、振荡器频率)
      SSD1316_Write_CMD(0xF0);      //0xF0
      SSD1316_Write_CMD(0x8D);      //Charge Pump Setting(设置电荷泵)
      SSD1316_Write_CMD(0x14);      //0x14
      SSD1316_Write_CMD(0xAF);      //Set Display ON(设置显示开)
      SSD1316_Clear();
//      SSD1316_Write_CMD(0x81);      //Set Contrast Control(设置对比度)
//      SSD1316_Write_CMD(0x7F);      //127
//      SSD1316_Write_CMD(0xA7);      //Set Normal/Inverse Display(设置反相显示)
//      OLED_DrawBMP(0,0,128,32,BMP1);
}

CyberHamster 发表于 2025-6-19 00:19:56


单片机和OLED可以统一用3.3V
输入5V可以使用LDO降压到3.3V
SSD1316:

strait 发表于 2025-6-20 20:42:48

谢谢各位大神的帮助!
我最后决定参照手册12.8的说明,增加一个3.3V的LDO 6206,也没有增加多少PCB空间。希望能一切顺利!
页: [1]
查看完整版本: AI8H8K64U I2C接口电平问题