找回密码
 立即注册
查看: 198|回复: 6

STC32G端口设置问题 | 已解决

[复制链接]
  • TA的每日心情
    开心
    2024-3-2 13:13
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    2

    主题

    11

    回帖

    124

    积分

    注册会员

    积分
    124
    发表于 2024-2-7 18:43:35 | 显示全部楼层 |阅读模式
    用STC端口2^6和2^7模拟I2C,同样的代码在STC15W4K48S上可以正常运行。尝试移植到STC32G12K128,总是无法点亮OLED12832屏幕,请各位大侠提供一些建议

    不想要外加上拉电阻(原来电路上没有加);也不想用硬件I2C(不想大改代码)
    注:确定电路连接没问题。已尝试过设为准双向口;开内部上拉电阻;SDA设置为开漏+SCL设置为强推挽等均无效。

    程序:

    STC32G_OLED0.91测试.rar

    59.67 KB, 下载次数: 8

    测试程序

    回复 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9323

    回帖

    1万

    积分

    管理员

    积分
    13908
    发表于 2024-2-7 19:15:27 | 显示全部楼层
    1, 打开内部 4K 上拉电阻
    2,多加些 NOP 延时,速度快了
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-2 13:13
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    2

    主题

    11

    回帖

    124

    积分

    注册会员

    积分
    124
     楼主| 发表于 2024-2-8 00:04:37 | 显示全部楼层
    神农鼎 发表于 2024-2-7 19:15
    1, 打开内部 4K 上拉电阻
    2,多加些 NOP 延时,速度快了


    //  WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
      EAXFR = 1; //扩展寄存器(XFR)访问使能
      CKCON = 0; //提高访问XRAM速度
           
             
            P2M0 = 0x00; P2M1 = 0x00;
      P2PU = 0xff;



    打开内部 4K 上拉电阻,降速还是不行


    void I2C_3(Uchar mcmd)
    {
    Uchar length = 8;                        // Send Command

            while(length--)
            {
                    if(mcmd & 0x80)
                    {
                            SDA3=1;
                    }
                    else
                    {
                            SDA3=0;
                    }
                    uDelay(3);
                    SCL3=1;
                    uDelay(3);
                    SCL3=0;
                    uDelay(3);
                    mcmd = mcmd << 1;
            }
    }
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 03:18
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3990

    积分

    荣誉版主

    积分
    3990
    发表于 2024-2-8 07:41:29 | 显示全部楼层
    由于 CPU构架 复杂程度 STC32 > STC8 > STC15, 总线的复杂程度增加, 引起 IO口翻转速度减慢.

    解决方法 1: IO口 加上拉电阻, 可保持原通讯速率.

    解决方法 2: 降低通讯速率 , 为原通讯速率 的1/2倍 试试, 如不行只能再降低 通讯速率. 否则会通讯不正常或丢失第一位数据.

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    5 天前
  • 签到天数: 97 天

    [LV.6]常住居民II

    9

    主题

    556

    回帖

    817

    积分

    高级会员

    积分
    817
    发表于 2024-2-8 08:28:52 | 显示全部楼层
    感觉还是时序方面的原因,速度太快了,建议用逻辑分析仪看一下具体原因,找到合适的通信速率。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-2 13:13
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    2

    主题

    11

    回帖

    124

    积分

    注册会员

    积分
    124
     楼主| 发表于 2024-2-8 10:19:31 | 显示全部楼层
    感谢大家!问题已解决,记录一下解决办法:
    1. 转换时加延时;
    2.模拟端口2^6、2^7换成2^0、2^1;前面两个端口模拟总是无法成功,加了延时也没有效果,原因不明。

    //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

    //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

    #include <STC32G.h>
    //#include "stc15w4k32s4.h"
    //#include <reg52.h>
    #include <intrins.h>



    #define Uchar unsigned char
    #define Uint  unsigned int
    #define Ulong unsigned long
    #define uchar unsigned char
    #define uint  unsigned int


    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    //  Pin Definition
    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

    //sbit SDA3=P2^6;                        //2_6串行的数据口51
    //sbit SCL3=P2^7;                 //2_7串行的同步时钟52
    sbit SDA3=P2^0;                        //2_6串行的数据口41
    sbit SCL3=P2^1;                 //2_7串行的同步时钟42
    sbit p3_0=P3^0;
    sbit p3_1=P3^1;

    //*********************************************************************0.66
    char code color13[]={
    /*--  调入了一幅图像:F:\工作\8051\OLED3\12832\1.bmp  --*/
    /*--  宽度x高度=128x32  --*/
    0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
    0x41,0x41,0x41,0xE1,0xF1,0xF1,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xC1,0xE1,0xF1,0x31,0x11,0x31,
    0xF1,0xE1,0xC1,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x81,0xE1,0xF1,0xF9,0xF9,0x01,
    0x01,0x01,0x01,0x01,0x41,0x71,0x39,0x1F,0x4F,0x77,0x39,0x1F,0x0F,0x07,0x01,0x01,
    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
    0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
    0x00,0xFF,0xFF,0xFF,0x00,0x00,0x60,0x78,0x5C,0x47,0x43,0x40,0xFF,0xFF,0xFF,0x40,
    0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
    0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xE0,0x00,0x00,
    0x08,0x08,0xC8,0x2F,0x2F,0x2F,0xC8,0x08,0x08,0xC0,0x20,0x20,0x20,0xCE,0x0E,0x2E,
    0xEE,0x00,0x20,0xE0,0x20,0x00,0x00,0x40,0x20,0x20,0x23,0xC7,0x0F,0x0C,0xC8,0x2C,
    0x2F,0x27,0xC3,0x00,0x20,0xE0,0x20,0x20,0x40,0x80,0x08,0x88,0x4F,0x2F,0x2F,0x48,
    0x88,0x00,0x00,0x60,0x20,0xE0,0x20,0x60,0x00,0x00,0xC0,0x20,0x20,0x20,0x60,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
    0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
    0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0xBF,0xA0,0x80,
    0x80,0x80,0xB0,0xA8,0xA4,0xA2,0xA1,0x80,0x80,0x9C,0xA3,0xA2,0xA3,0x9C,0x80,0xA0,
    0xB8,0xA7,0x87,0xB8,0xA0,0x80,0x80,0x90,0xA0,0xA1,0xA1,0x9E,0x80,0x80,0xB0,0xA8,
    0xA4,0xA2,0xA1,0x80,0xA0,0xBF,0xA0,0xA0,0x90,0x8F,0x80,0x8F,0x90,0xA0,0xA0,0x90,
    0x8F,0x80,0x80,0x80,0xA0,0xBF,0xA0,0x80,0x80,0x80,0xB0,0xA1,0xA2,0xA2,0x9C,0x80,
    0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
    0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF
    };
    char code color14[]={/*--  调入了一幅图像:F:\工作\8051\OLED3\12832\中文显示1.bmp  --*/
    /*--  宽度x高度=128x32  --*/
    0x00,0x20,0xA0,0x78,0x20,0xF8,0x20,0x00,0x00,0x00,0x10,0xF8,0x00,0x00,0x00,0x00,
    0xF0,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xF8,0x88,
    0x88,0x88,0xFE,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x20,0x10,0xF8,0x06,0x20,0x20,
    0x7E,0x90,0x88,0x88,0x84,0xE0,0x00,0x00,0x00,0x00,0x00,0x80,0x7E,0x80,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xF2,0x92,0x92,0x92,0x9E,0x80,0x80,
    0x00,0x00,0x08,0x08,0x08,0xFE,0x08,0x08,0x08,0xFE,0x08,0x08,0x00,0x00,0x20,0x24,
    0xA4,0xFC,0xA2,0x22,0x20,0xF8,0x08,0x08,0xF8,0x00,0x00,0x00,0xFE,0x02,0x4A,0x4A,
    0xFA,0x4A,0xCA,0x4A,0x02,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x02,0x0F,0x02,0x0F,0x02,0x02,0x00,0x00,0x00,0x08,0x0F,0x08,0x00,0x00,0x00,
    0x07,0x08,0x08,0x08,0x07,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x01,0x00,
    0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x02,0x02,0x02,0x02,0x02,0x1F,
    0x02,0x02,0x02,0x02,0x02,0x82,0x00,0x10,0x08,0x84,0x02,0x01,0x00,0x01,0x02,0x04,
    0x08,0x18,0x08,0x00,0x00,0x1F,0x10,0x08,0x84,0x00,0x03,0x04,0x08,0x10,0x10,0x1C,
    0x00,0x01,0x11,0x09,0x05,0x03,0x01,0x01,0x03,0x05,0x09,0x11,0x01,0x00,0x04,0x03,
    0x00,0x1F,0x00,0x01,0x00,0x0F,0x04,0x04,0x07,0x00,0x00,0x00,0x1F,0x0A,0x0A,0x0A,
    0x0B,0x0A,0x0A,0x0B,0x0A,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x20,0xE0,0x3C,0x20,0xE0,0x3C,0x20,0x00,0x00,0x08,0x08,0xFC,0x00,0x00,0x00,
    0x00,0x00,0x38,0x04,0x04,0x04,0xC4,0x38,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,
    0x00,0x00,0x00,0xFE,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0xFE,0x04,0x00,
    0x00,0x10,0x08,0x04,0xFE,0x01,0x01,0x08,0x88,0x3F,0x44,0x44,0x42,0x43,0x72,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x1F,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x79,0xC9,0x49,0x49,0x4F,0x40,0x40,0x00,
    0x00,0x00,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x00,
    0x00,0x00,0x12,0x12,0xD2,0xFE,0x91,0x11,0x11,0x00,0xFC,0x04,0x04,0x04,0xFC,0x00,
    0x00,0x02,0x1F,0x02,0x02,0x1F,0x02,0x02,0x00,0x00,0x10,0x10,0x1F,0x10,0x10,0x00,
    0x00,0x00,0x18,0x14,0x12,0x11,0x10,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,
    0x00,0x00,0x00,0x03,0x01,0x01,0x01,0x01,0x7F,0x01,0x01,0x01,0x01,0x03,0x00,0x00,
    0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
    0x00,0x00,0x20,0x10,0x08,0x06,0x01,0x00,0x00,0x00,0x03,0x06,0x0C,0x18,0x30,0x10,
    0x00,0x00,0x00,0x7F,0x20,0x10,0x08,0x00,0x00,0x01,0x06,0x08,0x10,0x20,0x78,0x00,
    0x00,0x01,0x01,0x41,0x21,0x19,0x0F,0x05,0x01,0x01,0x03,0x05,0x19,0x71,0x21,0x01,
    0x00,0x08,0x04,0x03,0x00,0x7F,0x00,0x07,0x02,0x00,0x1F,0x08,0x08,0x08,0x1F,0x00
    };

    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

    void         delay_ms(Uint t)
    {
            Uchar i,j;
            while(--t)
            {
            i=50;       
            j=100;

                    while(--j)
                            while(--i);
            }
    }
    void uDelay(Uchar l)
    {
            while(l--);
    }


    void Delay(Uchar n)
    {
    Uchar i,j,k;

            for(k=0;k<n;k++)
            {
                    for(i=0;i<131;i++)
                    {
                            for(j=0;j<15;j++)
                            {
                                    uDelay(203);       
                            }
                    }
            }
    }



    //****************************************************************************
    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    //  Read/Write Sequence
    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    void I2C_3(Uchar mcmd)
    {
    Uchar length = 8;                        // Send Command

            while(length--)
            {
                    if(mcmd & 0x80)
                    {
                            SDA3=1;
                    }
                    else
                    {
                            SDA3=0;
                    }
                    uDelay(3);
                    SCL3=1;
                    uDelay(3);
                    SCL3=0;
                    uDelay(3);
                    mcmd = mcmd << 1;
            }
    }


    void I2C_Ack3()
    {
            SDA3=1;
            uDelay(3);
            SCL3=1;
            uDelay(3);
            SCL3=0;
            uDelay(3);
    }


    void I2C_NAck3()
    {
            SDA3=0;
            uDelay(3);
            SCL3=1;
            uDelay(3);
            SCL3=0;
            uDelay(3);
    }


    void I2C_Start3()
    {
            SDA3=0;
            uDelay(3);
            SCL3=1;
            uDelay(3);
            SCL3=0;
            uDelay(3);
            I2C_3(0x78);
            I2C_Ack3();
    }


    void I2C_Stop3()
    {
            SCL3=1;
            uDelay(5);
            SDA3=0;
            uDelay(5);
            SDA3=1;
            uDelay(5);
    }


    void Write_Command3(Uchar Data)
    {
            I2C_Start3();
            I2C_3(0x00);
            I2C_Ack3();
            I2C_3(Data);
            I2C_Ack3();
            I2C_Stop3();
    }


    void Write_Data3(Uchar Data)
    {
            I2C_Start3();
            I2C_3(0x40);
            I2C_Ack3();
            I2C_3(Data);
            I2C_Ack3();
            I2C_Stop3();
    }
    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

    void        LCD_Init3(void)
    {


            Write_Command3(0xae);        //--turn off oled panel

            Write_Command3(0x00);        //--set low column address
            Write_Command3(0x10);        //--set high column address

            Write_Command3(0x00);        //--set start line address

            Write_Command3(0xb0);        //--set page address

            Write_Command3(0x81);        //--set contrast control register
            Write_Command3(0xff);

            Write_Command3(0xa1);        //--set segment re-map 127 to 0   a0:0 to seg127
            Write_Command3(0xa6);        //--set normal display

            Write_Command3(0xc8);        //--set com(N-1)to com0  c0:com0 to com(N-1)

            Write_Command3(0xa8);        //--set multiples ratio(1to64)
            Write_Command3(0x1f);        //--1/64 duty

            Write_Command3(0xd3);        //--set display offset
            Write_Command3(0x00);        //--not offset

            Write_Command3(0xd5);        //--set display clock divide ratio/oscillator frequency
            Write_Command3(0x80);        //--set divide ratio

            Write_Command3(0xd9);        //--set pre-charge period
            Write_Command3(0x04);

            Write_Command3(0xda);        //--set com pins hardware configuration
            Write_Command3(0x00);

            Write_Command3(0xdb);        //--set vcomh
            Write_Command3(0x30);

            Write_Command3(0x8d);        //--set chare pump enable/disable
            Write_Command3(0x14);        //--set(0x10) disable
            //Write_Command3(0x10);        //--set(0x10) disable
            Write_Command3(0xaf);        //--turn on oled panel
            //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=void         LCD_Init(void)
    }


    //***********************************************************************
    void clr_display3(void)
    {
            Uchar i,j;
            for(j=0;j<4;j++)
            {
                    Write_Command3(0x22);//--set page1
                    Write_Command3(j);//--set start page
                    Write_Command3(0x03);//--set end page

                    for(i=0;i<128;i++)                                                  //显示单色数据到LCD
                    {
                            Write_Data3(0x00);
                    }
            }
    }
                           
    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    void pic13(void)
    {
            Uchar i,j;
            Uint k;
            k=0;
            for(j=0;j<4;j++)
            {
                    Write_Command3(0x22);//--set page1
                    Write_Command3(j);//--set start page
                    Write_Command3(0x03);//--set end page

                    for(i=0;i<128;i++)                                                  //显示单色数据到LCD
                    {
                            Write_Data3(color13[k]);
                            k=k+1;
                   
                    }
            }
    }


    void pic14(void)
    {
            Uchar i,j;
            Uint k;
            k=0;
            for(j=0;j<4;j++)
            {
                    Write_Command3(0x22);//--set page1
                    Write_Command3(j);//--set start page
                    Write_Command3(0x03);//--set end page

                    for(i=0;i<128;i++)                                                  //显示单色数据到LCD
                    {
                            Write_Data3(color14[k]);
                            k=k+1;
                   
                    }
            }
    }
                           
    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

    //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    void main()
    {
            WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
            EAXFR = 1; //扩展寄存器(XFR)访问使能
            CKCON = 0; //提高访问XRAM速度
           
             
            P2M0 = 0x00; P2M1 = 0x00;
      P2PU = 0xff;

            LCD_Init3();
            p3_0=1;p3_1=0;       
            while(1)

            {   
                    pic13();
                    delay_ms(10);
                    pic14();
                    delay_ms(10);
                    p3_0=~p3_0;

            }
    }
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9323

    回帖

    1万

    积分

    管理员

    积分
    13908
    发表于 2024-2-8 17:23:39 | 显示全部楼层
    回复 支持 1 反对 0 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-5 14:45 , Processed in 0.064880 second(s), 55 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表