找回密码
 立即注册
查看: 691|回复: 22

关于STC8G1K08-SOP16 串口2无法通讯

[复制链接]
  • TA的每日心情
    开心
    2023-12-12 09:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    1

    主题

    1

    回帖

    9

    积分

    新手上路

    积分
    9
    发表于 2023-12-12 09:44:18 | 显示全部楼层 |阅读模式
    新打样了一批小板,有个串口2 做的是USB转TTL的,原理图如下,串口1做烧录口,通讯和烧录都没问题,串口2折腾半天都没数据互通
    截图202312120943075779.jpg



    代码几乎所有官方例程都试过了 ,贴一下吧


    /*------------------------------------------------------------------*/
    /* --- STC MCU International Limited -------------------------------*/
    /* --- STC 1T Series MCU Demo --------------------------------------*/
    /* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
    /* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
    /* --- Web: www.stcai.com ------------------------------------------*/
    /* --- BBS: www.stcaimcu.com ---------------------------------------*/
    /* If you want to use the program or the program referenced in the  */
    /* article, please specify in which data and procedures from STC    */
    /*------------------------------------------------------------------*/


    /*********************************************************/
    //        #define MAIN_Fosc                24000000L        //定义主时钟
    //        #define MAIN_Fosc                22118400L        //定义主时钟
            #define MAIN_Fosc                11059200L        //定义主时钟

    #include        "..\..\STC8Gxxx.h"


    /*************        功能说明        **************

    请先别修改程序, 直接下载"06-串口1-串口2-同时中断收发-C语言"里的"UART1-UART2.hex"测试,主频选择11.0592MHZ.  测试正常后再修改移植.

    2个串口(串口1 串口2)全双工中断方式收发通讯程序。

    通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.

    默认参数:
    所有串口均设置均为 1位起始位, 8位数据位, 1位停止位, 无校验.
    每个串口可以使用不同的波特率.
    串口1(P3.0 P3.1): 115200bps.
    串口2(P1.0 P1.1):  57600bps.


    ******************************************/

    /*************        本地常量声明        **************/
    #define        RX1_Length        128                /* 接收缓冲长度 */
    #define        RX2_Length        128                /* 接收缓冲长度 */


    /*************        本地变量声明        **************/
    u8        xdata        RX1_Buffer[RX1_Length];        //接收缓冲
    u8        xdata        RX2_Buffer[RX2_Length];        //接收缓冲

    u8        TX1_read,RX1_write;        //读写索引(指针).
    u8        TX2_read,RX2_write;        //读写索引(指针).

    bit        B_TX1_Busy,B_TX2_Busy;        // 发送忙标志


    /*************        本地函数声明        **************/
    void        UART1_config(u32 brt, u8 timer, u8 io);        // brt: 通信波特率,  timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率. io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7, =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
    void        UART2_config(u32 brt, u8 timer, u8 io);        // brt: 通信波特率,  timer=任意值: 波特率使用定时器2. io=0: 串口2切换到P1.0 P1.1, =1: 切换到P4.6 P4.7.
    void         UART1_PrintString(u8 *puts);
    void         UART2_PrintString(u8 *puts);




    //========================================================================
    // 函数: void main(void)
    // 描述: 主函数
    // 参数: none.
    // 返回: none.
    // 版本: VER1.0
    // 日期: 2018-4-2
    // 备注:
    //========================================================================
    void main(void)
    {
            u8        i;

            EAXRAM();

            UART1_config(115200UL, 1, 0);        // brt: 通信波特率,  timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率. io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7, =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
            UART2_config( 57600UL, 2, 0);        // brt: 通信波特率,  timer=任意值: 波特率使用定时器2. io=0: 串口2切换到P1.0 P1.1, =1: 切换到P4.6 P4.7.

            EA = 1;

            for(i=0; i<RX1_Length; i++)                RX1_Buffer = 0;
            B_TX1_Busy  = 0;
            TX1_read    = 0;
            RX1_write   = 0;

            for(i=0; i<RX2_Length; i++)                RX2_Buffer = 0;
            B_TX2_Busy  = 0;
            TX2_read    = 0;
            RX2_write   = 0;
           
            UART1_PrintString("STC8G系列 UART1 Test!\r\n");
            UART2_PrintString("STC8G系列 UART2 Test!\r\n");


            while (1)
            {

                    if((TX1_read != RX1_write) && !B_TX1_Busy)        //收到过数据, 并且发送空闲
                    {
                            B_TX1_Busy = 1;                //标志发送忙
                            SBUF = RX1_Buffer[TX1_read];        //发一个字节
                            if(++TX1_read >= RX1_Length)        TX1_read = 0;        //避免溢出处理
                    }

                    if((TX2_read != RX2_write) && !B_TX2_Busy)        //收到过数据, 并且发送空闲
                    {
                            B_TX2_Busy = 1;                //标志发送忙
                            S2BUF = RX2_Buffer[TX2_read];        //发一个字节
                            if(++TX2_read >= RX2_Length)        TX2_read = 0;        //避免溢出处理
                    }
            }
    }


    //========================================================================
    // 函数: SetTimer2Baudraye(u16 dat)
    // 描述: 设置Timer2做波特率发生器。
    // 参数: dat: Timer2的重装值.
    // 返回: none.
    // 版本: VER1.0
    // 日期: 2018-4-2
    // 备注:
    //========================================================================
    void        SetTimer2Baudrate(u16 dat)        // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
    {
            AUXR &= ~(1<<4);        //Timer stop
            AUXR &= ~(1<<3);        //Timer2 set As Timer
            AUXR |=  (1<<2);        //Timer2 set as 1T mode
            TH2 = (u8)(dat >> 8);
            TL2 = (u8)dat;
            IE2  &= ~(1<<2);        //禁止中断
            AUXR |=  (1<<4);        //Timer run enable
    }


    //========================================================================
    // 函数: void        UART1_config(u32 brt, u8 timer, u8 io)
    // 描述: UART1初始化函数。
    // 参数:   brt: 通信波特率.
    //       timer: 波特率使用的定时器, timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率.
    //          io: 串口1切换到的IO,  io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7, =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
    // 返回: none.
    // 版本: VER1.0
    // 日期: 2018-4-2
    // 备注:
    //========================================================================
    void        UART1_config(u32 brt, u8 timer, u8 io)        // brt: 通信波特率,  timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率. io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7, =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
    {
            brt = 65536UL - (MAIN_Fosc / 4) / brt;
            if(timer == 2)        //波特率使用定时器2
            {
                    AUXR |= 0x01;                //S1 BRT Use Timer2;
                    SetTimer2Baudrate((u16)brt);
            }

            else                //波特率使用定时器1
            {
                    TR1 = 0;
                    AUXR &= ~0x01;                //S1 BRT Use Timer1;
                    AUXR |=  (1<<6);        //Timer1 set as 1T mode
                    TMOD &= ~(1<<6);        //Timer1 set As Timer
                    TMOD &= ~0x30;                //Timer1_16bitAutoReload;
                    TH1 = (u8)(brt >> 8);
                    TL1 = (u8)brt;
                    ET1 = 0;                        // 禁止Timer1中断
                    INT_CLKO &= ~0x02;        // Timer1不输出高速时钟
                    TR1  = 1;                        // 运行Timer1
            }

    //                 if(io == 1)        {S1_USE_P32P33();        P3n_standard(0x0c);}        //切换到 P3.2 P3.3        用于8脚MCU
    //        else if(io == 2)        {S1_USE_P54P53();        P5n_standard(0x18);}        //切换到 P5.4 P5.3        用于8脚MCU
                     if(io == 1)        {S1_USE_P36P37();        P3n_standard(0xc0);}        //切换到 P3.6 P3.7
            else if(io == 2)        {S1_USE_P16P17();        P1n_standard(0xc0);}        //切换到 P1.6 P1.7
            else if(io == 3)        {S1_USE_P43P44();        P4n_standard(0x18);}        //切换到 P4.3 P4.4
            else                                {S1_USE_P30P31();        P3n_standard(0x03);}        //切换到 P3.0 P3.1

            SCON = (SCON & 0x3f) | (1<<6);        // 8位数据, 1位起始位, 1位停止位, 无校验
    //        PS  = 1;        //高优先级中断
            ES  = 1;        //允许中断
            REN = 1;        //允许接收
    }


    //========================================================================
    // 函数: void        UART2_config(u32 brt, u8 timer, u8 io)
    // 描述: UART2初始化函数。
    // 参数:   brt: 通信波特率.
    //       timer: 波特率使用的定时器, timer=任意值: 波特率使用定时器2.
    //          io: 串口2切换到的IO,  io=0: 串口2切换到P1.0 P1.1, =1: 切换到P4.6 P4.7.
    // 返回: none.
    // 版本: VER1.0
    // 日期: 2018-4-2
    // 备注:
    //========================================================================
    void        UART2_config(u32 brt, u8 timer, u8 io)        // brt: 通信波特率,  timer=任意值: 波特率使用定时器2. io=0: 串口2切换到P1.0 P1.1, =1: 切换到P4.6 P4.7.
    {
            brt = 65536UL - (MAIN_Fosc / 4) / brt;
            if(timer == 2)        SetTimer2Baudrate((u16)brt);        //波特率使用定时器2
            else                        SetTimer2Baudrate((u16)brt);        //波特率使用定时器2                两个条件都使用Timer2, 是为了跟另外串口函数兼容

            S2CON &= ~(1<<7);        // 8位数据, 1位起始位, 1位停止位, 无校验
            IE2   |= 1;                        //允许中断
            S2CON |= (1<<4);        //允许接收
            if(io == 1)        {        P_SW2 |=  1;        P4n_standard(0xc0);}        //切换到 P4.6 P4.7
            else                {        P_SW2 &= ~1;        P1n_standard(0x03);}        //切换到 P1.0 P1.1
    }


    //========================================================================
    // 函数: void UART1_PrintString(u8 *puts)
    // 描述: 串口1字符串打印函数
    // 参数: puts: 字符串指针.
    // 返回: none.
    // 版本: VER1.0
    // 日期: 2018-4-2
    // 备注:
    //========================================================================
    void UART1_PrintString(u8 *puts)
    {
        for (; *puts != 0;        puts++)
            {
                    B_TX1_Busy = 1;                //标志发送忙
                    SBUF = *puts;                //发一个字节
                    while(B_TX1_Busy);        //等待发送完成
            }
    }

    //========================================================================
    // 函数: void UART2_PrintString(u8 *puts)
    // 描述: 串口2字符串打印函数
    // 参数: puts: 字符串指针.
    // 返回: none.
    // 版本: VER1.0
    // 日期: 2018-4-2
    // 备注:
    //========================================================================
    void UART2_PrintString(u8 *puts)
    {
        for (; *puts != 0;        puts++)
            {
                    B_TX2_Busy = 1;                //标志发送忙
                    S2BUF = *puts;                //发一个字节
                    while(B_TX2_Busy);        //等待发送完成
            }
    }


    //========================================================================
    // 函数: void UART1_int (void) interrupt UART1_VECTOR
    // 描述: 串口1中断函数
    // 参数: none.
    // 返回: none.
    // 版本: VER1.0
    // 日期: 2018-4-2
    // 备注:
    //========================================================================
    void UART1_int (void) interrupt UART1_VECTOR
    {
            if(RI)
            {
                    RI = 0;
                    RX1_Buffer[RX1_write] = SBUF;
                    if(++RX1_write >= RX1_Length)        RX1_write = 0;
            }

            if(TI)
            {
                    TI = 0;
                    B_TX1_Busy = 0;
            }
    }

    //========================================================================
    // 函数: void UART2_int (void) interrupt UART2_VECTOR
    // 描述: 串口2中断函数
    // 参数: none.
    // 返回: none.
    // 版本: VER1.0
    // 日期: 2018-4-2
    // 备注:
    //========================================================================
    void UART2_int (void) interrupt UART2_VECTOR
    {
            if(RI2)
            {
                    CLR_RI2();
                    RX2_Buffer[RX2_write] = S2BUF;
                    if(++RX2_write >= RX2_Length)        RX2_write = 0;
            }

            if(TI2)
            {
                    CLR_TI2();
                    B_TX2_Busy = 0;
            }

    }


    还是跑不通

    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:37
  • 签到天数: 143 天

    [LV.7]常住居民III

    20

    主题

    1093

    回帖

    2603

    积分

    金牌会员

    积分
    2603
    发表于 2023-12-12 11:38:46 | 显示全部楼层
    你得看看STC8G1k08 有没有串口2....我看着好像没有,,
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:37
  • 签到天数: 143 天

    [LV.7]常住居民III

    20

    主题

    1093

    回帖

    2603

    积分

    金牌会员

    积分
    2603
    发表于 2023-12-12 11:40:23 | 显示全部楼层
    看这个图
    截图202312121140074269.jpg
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 20:31
  • 签到天数: 168 天

    [LV.7]常住居民III

    43

    主题

    369

    回帖

    1103

    积分

    金牌会员

    静坐常思己过,闲谈莫论人非

    积分
    1103
    发表于 2023-12-12 17:05:29 | 显示全部楼层

    有串口2吧
    8G1K108.png

    处事要代人所想,读书需切己用功
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 20:31
  • 签到天数: 168 天

    [LV.7]常住居民III

    43

    主题

    369

    回帖

    1103

    积分

    金牌会员

    静坐常思己过,闲谈莫论人非

    积分
    1103
    发表于 2023-12-12 17:15:15 | 显示全部楼层
    本帖最后由 rengran 于 2023-12-12 17:16 编辑

    芯片引脚上有P4吗?
    Snipaste_2023-12-12_17-15-51.png

    处事要代人所想,读书需切己用功
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:37
  • 签到天数: 143 天

    [LV.7]常住居民III

    20

    主题

    1093

    回帖

    2603

    积分

    金牌会员

    积分
    2603
    发表于 2023-12-12 17:38:51 | 显示全部楼层

    你看错了啊,,你用的到底是 STC8G1k 还是 STC8H1K啊
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:37
  • 签到天数: 143 天

    [LV.7]常住居民III

    20

    主题

    1093

    回帖

    2603

    积分

    金牌会员

    积分
    2603
    发表于 2023-12-12 17:40:16 | 显示全部楼层

    哦 这老哥问得是STC8G1K  原理图上也写的STC8G  你框起来的是啥
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 20:31
  • 签到天数: 168 天

    [LV.7]常住居民III

    43

    主题

    369

    回帖

    1103

    积分

    金牌会员

    静坐常思己过,闲谈莫论人非

    积分
    1103
    发表于 2023-12-12 17:42:29 | 显示全部楼层
    cofmilk 发表于 2023-12-12 17:38
    你看错了啊,,你用的到底是 STC8G1k 还是 STC8H1K啊

    确实看错了
    处事要代人所想,读书需切己用功
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:37
  • 签到天数: 143 天

    [LV.7]常住居民III

    20

    主题

    1093

    回帖

    2603

    积分

    金牌会员

    积分
    2603
    发表于 2023-12-12 17:44:27 | 显示全部楼层

    哈哈  感觉楼主也是看到了 然后买错了的说毕竟STC8G还要便宜一点儿
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 20:31
  • 签到天数: 168 天

    [LV.7]常住居民III

    43

    主题

    369

    回帖

    1103

    积分

    金牌会员

    静坐常思己过,闲谈莫论人非

    积分
    1103
    发表于 2023-12-12 17:46:45 | 显示全部楼层
    cofmilk 发表于 2023-12-12 17:40
    哦 这老哥问得是STC8G1K  原理图上也写的STC8G  你框起来的是啥

    手册上却又TxD2和RxD2
    截图202312121746343263.jpg

    处事要代人所想,读书需切己用功
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-19 00:16 , Processed in 0.087033 second(s), 69 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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