找回密码
 立即注册
查看: 505|回复: 12

现在急等,USART1复用SPI问题,无法进入接收中断!

[复制链接]

该用户从未签到

2

主题

28

回帖

80

积分

注册会员

积分
80
发表于 2023-8-1 13:24:05 | 显示全部楼层 |阅读模式
因为我画板的时候用的P6.4,P6.5,P6.6,P6.7。所以只能用USART1复用SPI,借鉴了STC32G实验箱例程包“78-USART1复用SPI与USART2复用SPI相互通信例程”这个例子使用USART SPI进行收发。   发现SPI发送没有问题,但是接收没法进入中断,用示波器检测,发现接收有波形,下面是程序:
回复 送花

使用道具 举报

该用户从未签到

2

主题

28

回帖

80

积分

注册会员

积分
80
 楼主| 发表于 2023-8-1 13:24:21 | 显示全部楼层
sbit S1SS       =   P6^4;
sbit S1MOSI     =   P6^5;
sbit S1MISO     =   P6^6;
sbit S1SCLK     =   P6^7;
回复 支持 反对 送花

使用道具 举报

该用户从未签到

2

主题

28

回帖

80

积分

注册会员

积分
80
 楼主| 发表于 2023-8-1 13:25:18 | 显示全部楼层
void usart1_spi_init()
{
//    S1SPI_S0 = 1;                       //Çл»S1SPIµ½P2.2/S1SS,P2.3/S1MOSI,P2.4/S1MISO,P2.5/S1SCLK
    S1SPI_S0 = 1;                       //Çл»S1SPIµ½P6.4/S1SS,P6.5/S1MOSI,P6.6/S1MISO,P6.7/S1SCLK
          S1SPI_S1 = 1;
    SCON = 0x10;                        //ʹÄܽÓÊÕ,±ØÐëÉèÖÃΪ´®¿Úģʽ0
   
    USARTCR1 = 0x11;                    //ʹÄÜUSART1µÄSPIģʽ
//  USARTCR1 |= 0x40;                   //DORD=1
    USARTCR1 &= ~0x40;                  //DORD=0
//  USARTCR1 |= 0x04;                   //´Ó»úģʽ
    USARTCR1 &= ~0x04;                  //Ö÷»úģʽ
    USARTCR1 |= 0x00;                   //CPOL=0, CPHA=0
//  USARTCR1 |= 0x01;                   //CPOL=0, CPHA=1
//  USARTCR1 |= 0x02 ;                  //CPOL=1, CPHA=0
//  USARTCR1 |= 0x03;                   //CPOL=1, CPHA=1
//  USARTCR4 = 0x00;                    //SPIËÙ¶ÈΪSYSCLK/4
//  USARTCR4 = 0x01;                    //SPIËÙ¶ÈΪSYSCLK/8
          USARTCR4 = 0x02;                    //SPIËÙ¶ÈΪSYSCLK/16
//  USARTCR4 = 0x03;                    //SPIËÙ¶ÈΪSYSCLK/2
    USARTCR1 |= 0x08;                   //ʹÄÜSPI¹¦ÄÜ

    ES = 1;
}
回复 支持 反对 送花

使用道具 举报

该用户从未签到

2

主题

28

回帖

80

积分

注册会员

积分
80
 楼主| 发表于 2023-8-1 13:25:52 | 显示全部楼层
void SPI_Write(void)
{

    wptr = 0;
    rptr = 0;
    over = 0;

          S1SS = 0;
    SBUF =  numbuf[rptr++];
    while (!over);                      //µÈ´ý128¸öÊý¾Ý´«ÊäÍê³É
    S1SS = 1;
}
回复 支持 反对 送花

使用道具 举报

该用户从未签到

2

主题

28

回帖

80

积分

注册会员

积分
80
 楼主| 发表于 2023-8-1 13:26:12 | 显示全部楼层

void uart1_isr() interrupt UART1_VECTOR
{
    if (TI)
    {
        TI = 0;
        
        if (rptr < 2)
        {
            SBUF = numbuf[rptr++];
        }
        else
        {
            over = 1;
        }
    }
   
    if (RI)
    {
                        RI = 0;

      P51=1;   

                }
}
回复 支持 反对 送花

使用道具 举报

该用户从未签到

2

主题

28

回帖

80

积分

注册会员

积分
80
 楼主| 发表于 2023-8-1 13:27:32 | 显示全部楼层
我用软件模拟的SPI也测试过了,可以正常收发
回复 支持 反对 送花

使用道具 举报

该用户从未签到

2

主题

28

回帖

80

积分

注册会员

积分
80
 楼主| 发表于 2023-8-1 15:15:48 | 显示全部楼层
有大佬给看一下吗?
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    前天 07:59
  • 签到天数: 101 天

    [LV.6]常住居民II

    41

    主题

    1016

    回帖

    6971

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6971
    QQ
    发表于 2023-8-4 10:34:45 | 显示全部楼层
    所以你的Spi配置的是主机还是从机模式?
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    2

    主题

    28

    回帖

    80

    积分

    注册会员

    积分
    80
     楼主| 发表于 2023-8-4 11:40:18 | 显示全部楼层
    电子DIY小家 发表于 2023-8-4 10:34
    所以你的Spi配置的是主机还是从机模式?

    主机模式,不过我调试的时候,主机从机都配置试了一下
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    552

    主题

    9497

    回帖

    1万

    积分

    管理员

    积分
    14071
    发表于 2023-8-4 11:50:52 | 显示全部楼层
    1.png


    16.7.6                     USART1和USART2的SPI接口相互传输数据(中断方式)
    //测试工作频率为24MHz
    //#include "stc8h.h"
    #include "stc32g.h"//头文件见下载软件
    #include "intrins.h"
    #include "stdio.h"
    #define       FOSC        24000000UL                                                     //系统工作频率
    typedef       bit                                 BOOL;
    typedef       unsignedchar              BYTE;
    typedef       unsignedint                 WORD;
    typedef       unsignedlong              DWORD;
    sbit S1SS            =       P2^2;
    sbit S1MOSI      =       P2^3;
    sbit S1MISO      =       P2^4;
    sbit S1SCLK       =       P2^5;
    sbit S2SS            =       P2^2;
    sbit S2MOSI      =       P2^3;
    sbit S2MISO      =       P2^4;
    sbit S2SCLK       =       P2^5;
    void sys_init();
    void usart1_spi_init();
    void usart2_spi_init();
    void test();
    BYTE xdata buffer1[256];                                                                    //定义缓冲区
    BYTE xdata buffer2[256];                                                                    //定义缓冲区
    BYTE rptr;
    BYTE wptr;
    bit     over;
    void main()
    {
             int     i;
             sys_init();                                                                                      //系统初始化
             usart1_spi_init();                                                                          //USART1使能SPI主模式初始化
             usart2_spi_init();                                                                          //USART2使能SPI从模式初始化
             EA= 1;
             for    (i=0; i<128; i++)
             {
                       buffer1= i;                                                                       //初始化缓冲区
                       buffer2= 0;
             }
             test();
             while(1);
    }
    void uart1_isr() interrupt UART1_VECTOR
    {
             if(TI)
             {
                       TI= 0;
                       if(rptr < 128)
                       {
                                SBUF= buffer1[rptr++];
                       }
                       else
                       {
                                over= 1;
                       }
             }
             if(RI)
             {
                       RI= 0;
             }
    }
    void uart2_isr() interrupt UART2_VECTOR
    {
             if(S2TI)
             {
                       S2TI= 0;
             }
             if(S2RI)
             {
                       S2RI= 0;
                       buffer2[wptr++]= S2BUF;
             }
    }
    void sys_init()
    {
             WTST= 0x00;
             CKCON=  0x00;
             EAXFR=  1;
             P0M0= 0x00; P0M1 = 0x00;
             P1M0= 0x00; P1M1 = 0x00;
             P2M0= 0x00; P2M1 = 0x00;
             P3M0= 0x00; P3M1 = 0x00;
             P4M0= 0x00; P4M1 = 0x00;
             P5M0= 0x00; P5M1 = 0x00;
             P6M0= 0x00; P6M1 = 0x00;
             P7M0= 0x00; P7M1 = 0x00;
             P40= 0;
             P6= 0xff;
    }
    void usart1_spi_init()
    {
             S1SPI_S0= 1;                                                                              //切换S1SPI
    //P2.2/S1SS,P2.3/S1MOSI,P2.4/S1MISO,P2.5/S1SCLK
             S1SPI_S1= 0;
             SCON= 0x10;                                                                              //使能接收,必须设置为串口模式0
             USARTCR1= 0x10;                                                                     //使能USART1SPI模式
    //       USARTCR1|= 0x40;                                                                    //DORD=1
             USARTCR1&= ~0x40;                                                               //DORD=0
    //       USARTCR1|= 0x04;                                                                    //从机模式
             USARTCR1&= ~0x04;                                                               //主机模式
             USARTCR1|= 0x00;                                                                    //CPOL=0, CPHA=0
    //       USARTCR1|= 0x01;                                                                    //CPOL=0,CPHA=1
    //       USARTCR1|= 0x02 ;                                                                   //CPOL=1,CPHA=0
    //       USARTCR1|= 0x03;                                                                    //CPOL=1,CPHA=1
             USARTCR4= 0x00;                                                                     //SPI速度为SYSCLK/4
    //       USARTCR4= 0x01;                                                                     //SPI速度为SYSCLK/8
    //       USARTCR4= 0x02;                                                                     //SPI速度为SYSCLK/16
    //       USARTCR4= 0x03;                                                                     //SPI速度为SYSCLK/2
             USARTCR1|= 0x08;                                                                    //使能SPI功能
             ES= 1;
    }
    void usart2_spi_init()
    {
             S2SPI_S0= 1;                                                                              //切换S2SPI
    //P2.2/S2SS,P2.3/S2MOSI,P2.4/S2MISO,P2.5/S2SCLK
             S2SPI_S1= 0;
             S2CON= 0x10;                                                                            //使能接收,必须设置为串口模式0
             USART2CR1= 0x10;                                                                   //使能USART2SPI模式
    //       USART2CR1|= 0x40;                                                                  //DORD=1
             USART2CR1&= ~0x40;                                                             //DORD=0
             USART2CR1|= 0x04;                                                                  //从机模式
    //       USART2CR1&= ~0x04;                                                             //主机模式
             USART2CR1|= 0x00;                                                                  //CPOL=0, CPHA=0
    //       USART2CR1|= 0x01;                                                                  //CPOL=0,CPHA=1
    //       USART2CR1|= 0x02 ;                                                                 //CPOL=1,CPHA=0
    //       USART2CR1|= 0x03;                                                                  //CPOL=1,CPHA=1
             USART2CR4= 0x00;                                                                   //SPI速度为SYSCLK/4
    //       USART2CR4= 0x01;                                                                   //SPI速度为SYSCLK/8
    //       USART2CR4= 0x02;                                                                   //SPI速度为SYSCLK/16
    //       USART2CR4= 0x03;                                                                   //SPI速度为SYSCLK/2
             USART2CR1|= 0x08;                                                                  //使能SPI功能
             ES2= 1;
    }
    void test()
    {
             BYTEi;
             BYTEret;
             wptr= 0;
             rptr= 0;
             over= 0;
             S1SS= 0;
             SBUF= buffer1[rptr++];                                                             //启动数据传输
             while(!over);                                                                                //等待128个数据传输完成
             S1SS= 1;
             ret     = 0x5a;
             for    (i=0; i<128; i++)
             {
                       if(buffer1 != buffer2)                                                 //校验数据
                       {
                                ret     = 0xfe;
                                break;
                       }
             }
             P6= ret;                                                                                        //P6=0x5a表示数据传输正确
    }




    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-19 02:17 , Processed in 0.087196 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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