凄雨辰 发表于 2023-8-1 13:24:05

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

因为我画板的时候用的P6.4,P6.5,P6.6,P6.7。所以只能用USART1复用SPI,借鉴了STC32G实验箱例程包“78-USART1复用SPI与USART2复用SPI相互通信例程”这个例子使用USART SPI进行收发。   发现SPI发送没有问题,但是接收没法进入中断,用示波器检测,发现接收有波形,下面是程序:

凄雨辰 发表于 2023-8-1 13:24:21

sbit S1SS       =   P6^4;
sbit S1MOSI   =   P6^5;
sbit S1MISO   =   P6^6;
sbit S1SCLK   =   P6^7;

凄雨辰 发表于 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;
}

凄雨辰 发表于 2023-8-1 13:25:52

void SPI_Write(void)
{

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

          S1SS = 0;
    SBUF =numbuf;
    while (!over);                      //µÈ´ý128¸öÊý¾Ý´«ÊäÍê³É
    S1SS = 1;
}

凄雨辰 发表于 2023-8-1 13:26:12


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

      P51=1;   

                }
}

凄雨辰 发表于 2023-8-1 13:27:32

我用软件模拟的SPI也测试过了,可以正常收发

凄雨辰 发表于 2023-8-1 15:15:48

有大佬给看一下吗?

电子DIY小家 发表于 2023-8-4 10:34:45

所以你的Spi配置的是主机还是从机模式?

凄雨辰 发表于 2023-8-4 11:40:18

电子DIY小家 发表于 2023-8-4 10:34
所以你的Spi配置的是主机还是从机模式?

主机模式,不过我调试的时候,主机从机都配置试了一下

神农鼎 发表于 2023-8-4 11:50:52




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;                                                                  //定义缓冲区BYTE xdata buffer2;                                                                  //定义缓冲区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;                   }                   else                   {                            over= 1;                   }         }         if(RI)         {                   RI= 0;         }}void uart2_isr() interrupt UART2_VECTOR{         if(S2TI)         {                   S2TI= 0;         }         if(S2RI)         {                   S2RI= 0;                   buffer2= 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;                                                                     //使能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;}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;                                                                   //使能USART2的SPI模式//       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;                                                             //启动数据传输         while(!over);                                                                              //等待128个数据传输完成         S1SS= 1;         ret   = 0x5a;         for    (i=0; i<128; i++)         {                   if(buffer1 != buffer2)                                                 //校验数据                   {                            ret   = 0xfe;                            break;                   }         }         P6= ret;                                                                                        //P6=0x5a表示数据传输正确}



页: [1] 2
查看完整版本: 现在急等,USART1复用SPI问题,无法进入接收中断!