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

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

[复制链接]

2

主题

28

回帖

84

积分

注册会员

积分
84
发表于 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

回帖

84

积分

注册会员

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

使用道具 举报 送花

2

主题

28

回帖

84

积分

注册会员

积分
84
发表于 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

回帖

84

积分

注册会员

积分
84
发表于 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

回帖

84

积分

注册会员

积分
84
发表于 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

回帖

84

积分

注册会员

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

使用道具 举报 送花

2

主题

28

回帖

84

积分

注册会员

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

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

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

使用道具 举报 送花

2

主题

28

回帖

84

积分

注册会员

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15626
发表于 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, 2025-5-2 15:40 , Processed in 0.452257 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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