乐此不疲 发表于 2025-2-21 21:01:00

请教在AI8051U擎天柱板子上好用的程序下载到8H8K64U中不好用了,请高手指点【已解决】

一段I/O口模拟SPI驱动墨水屏的程序下载到AI8051U以8bit模式运行时刷屏没问题,程序中换了8H.h并且主函数中注释掉WTST=0;CKCON=0;这两句后下载到8H8K64U中刷屏失败(实验板为开天斧三),给所有涉及控制的I/O口都配置内部上拉电阻也没效果(擎天柱板子I/O有外部上拉电阻),最近这两款芯片我都在用,在8bit工作模式下感觉两者的代码一直是可以通用的,这次有些蒙,弄了两天了也没弄出头绪。用简易的逻辑分析仪检测SPI数据完全正常,请各位高手指点下是哪里不对劲了。
下面是主函数代码:(keil uv3编译)
#include "STC8H.h"
#include "SSD1680EPD.h"
#include "delay.h"
#include "Ap_29demo.h"

//---------------------------------------------------
void main()
{
EAXSFR();//允许访问扩展RAM区特殊功能寄存器( XFR)
//WTST= 0;
//CKCON = 0;
GPIO_set();//预置所有I/O口全部为准双向口

P1M0 = 0x28;//P1.3、P1.5推挽输出(SPI通道1)
P1M1 = 0x00;
P1PU |= 0x28;//P1.3、P1.5配置上拉电阻

P3M0 = 0x2c;//P3.2、P3.3、P3.5推挽输出,P3.4高阻输入
P3M1 = 0x10;
P3PU = 0x3c;

delay_500ms();

EPD_HW_Init(Hor);
EPD_WhiteScreen_White();
EPD_sleep();
delay_500ms();

P20 = 1;

while(1)
{
    P20 = ~P20;
    delay_500ms();
}
}以下为SPI代码:
//----I/O模拟SPI总线发送字节数据函数--------------------
void SPI_WriteByte(u8 value)
{
u8 i, dat;
dat = value;
SPI_CLK = 0;

for(i = 0; i < 8; i++)
{
    if(dat & 0x80)
    {
      SPI_SDA = 1;
    }
    else
    {
      SPI_SDA = 0;
    }

    SPI_CLK = 1;
    NOP7();
    dat = dat << 1;
    SPI_CLK = 0;
}
}
//----写指令-------------------------------------------
void Write_command(u8 command)
{
CS = 0;
NOP10();
DC = 0;
SPI_WriteByte(command);
NOP5();
CS = 1;
NOP30();
}
//----写数据-------------------------------------------
void Write_data(u8 dat)
{
CS = 0;
NOP10();
DC = 1;
SPI_WriteByte(dat);
NOP5();
CS = 1;
NOP30();
}端口定义如下:
//----EPD端口设置---------------------------------------------------
sbit CS = P3 ^ 2;
sbit DC = P3 ^ 3;
sbit BY = P3 ^ 4;
sbit RST = P3 ^ 5;
sbit SPI_SDA = P1 ^ 3;
sbit SPI_CLK = P1 ^ 5;

Yim_Hom 发表于 2025-2-22 00:14:36

1、设置推挽输出的管脚,关闭内部上拉;
2、初始化时,RES和D0两个管脚,先置低再置高。
然后再试下呢?

乐此不疲 发表于 2025-2-22 10:29:36

Yim_Hom 发表于 2025-2-22 00:14
1、设置推挽输出的管脚,关闭内部上拉;
2、初始化时,RES和D0两个管脚,先置低再置高。
然后再试下呢?


多谢,首先关于我的内部上拉是在测试失败后添加的,关闭了也应该还是有问题,其次关于屏幕复位在屏幕初始化中是有操作的:
RST = 0;
delay_ms(100);
RST = 1;
delay_ms(100);

read_BUSY();
Write_command(0x12); // soft reset
read_BUSY();

Write_command(0x01); //Driver output control
Write_data((EPD_WIDTH - 1) % 256);
Write_data((EPD_WIDTH - 1) / 256);
Write_data(0x00);

Write_command(0x11); //data entry mode

Yim_Hom 发表于 2025-2-22 15:34:56

软件spi和iic驱动oled屏最近都用,不论8h、还是8051u-32bit我都在正常用,而且也做到了8051u-32bit的spi和iic的同时显示不同内容,我看你的代码了,我之前也遇到了跟你一样的问题,但rst和d0在gpio初始化时经过我这样的配置,就没问题了。

乐此不疲 发表于 2025-2-22 22:04:49

Yim_Hom 发表于 2025-2-22 15:34
软件spi和iic驱动oled屏最近都用,不论8h、还是8051u-32bit我都在正常用,而且也做到了8051u-32bit的spi和i ...

按照你说的方法我在主函数中加入了SPI_SDA=0;RST=0;但仍然没能解决问题,其实这两年我用20引脚的STC8H8K64U也驱动了几块4.2寸的墨水屏了也是第一次遇到这种情况。
这次的经历先是在STC8H8K64U中调试这个2.13寸墨水屏的驱动程序、弄了好久没能正常刷屏显示,后来把代码换了头文件下载到AI8051U中竟然显示正常毫无问题,程序运行非常稳定,既然程序没问题为什么下载到STC8H8K64U中就不正常工作,百思不得其解。

Yim_Hom 发表于 2025-2-22 22:09:45

咱俩可能说的不是一回事,你试下我这样。
/*将D0、D1、RES、DC和CS引脚初始化为推挽输出模式*/
                P2_MODE_OUT_PP(GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
               
                /*置引脚默认电平*/
                OLED_W_RES(0);
                OLED_W_D0(0);
                OLED_W_D1(1);
                OLED_W_RES(1);
                OLED_W_DC(1);
                OLED_W_CS(1);

Yim_Hom 发表于 2025-2-22 22:11:13

目前,我在8h、8051u-8、8051u-32模式,同一套改吧改吧都能正常用。

乐此不疲 发表于 2025-2-23 10:59:07

Yim_Hom 发表于 2025-2-22 22:09
咱俩可能说的不是一回事,你试下我这样。
/*将D0、D1、RES、DC和CS引脚初始化为推挽输出模式*/
                P2_MODE_O ...

不知道你的屏幕接口定义中的D0、D1的含义,我一直以为你说的D0是单片机侧的DO(MOSI)引脚、我的定义为SPI_SDA。

乐此不疲 发表于 2025-2-23 11:06:08

Yim_Hom 发表于 2025-2-22 22:11
目前,我在8h、8051u-8、8051u-32模式,同一套改吧改吧都能正常用。

确实如此,我一直喜欢玩屏最近痴迷玩电子价签的墨水屏,因为我编程很菜所以我都是找例程来修改应用,很多时候都是移植arduino-ESP8266或SMT32F1**的例程到STC单片机中来用也玩的挺顺手的,这次在这个很小的墨水屏上翻车了。

ercircle 发表于 2025-2-23 11:35:48

看到代码里用NOP控制时序,有逻辑分析仪的话抓下波形吧,可能两个芯片快慢不一样NOP导致的时序不一样?之前移植51程序遇到过类似现象
页: [1] 2
查看完整版本: 请教在AI8051U擎天柱板子上好用的程序下载到8H8K64U中不好用了,请高手指点【已解决】