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电源,也有够烦的
STC8H8K64U 是宽电压芯片,可以使用和显示模块一样的电压;
STC8H8K64U的 I2C 接口 设置为开漏工作模式;
显示模块的I2C 应有外部上拉电阻,或其芯片内部有上拉电阻
查找资料发现是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);
}
单片机和OLED可以统一用3.3V
输入5V可以使用LDO降压到3.3V
SSD1316:
谢谢各位大神的帮助!
我最后决定参照手册12.8的说明,增加一个3.3V的LDO 6206,也没有增加多少PCB空间。希望能一切顺利!
页:
[1]