现在急等,USART1复用SPI问题,无法进入接收中断!
因为我画板的时候用的P6.4,P6.5,P6.6,P6.7。所以只能用USART1复用SPI,借鉴了STC32G实验箱例程包“78-USART1复用SPI与USART2复用SPI相互通信例程”这个例子使用USART SPI进行收发。 发现SPI发送没有问题,但是接收没法进入中断,用示波器检测,发现接收有波形,下面是程序: sbit S1SS = P6^4;sbit S1MOSI = P6^5;
sbit S1MISO = P6^6;
sbit S1SCLK = P6^7; 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;
} void SPI_Write(void)
{
wptr = 0;
rptr = 0;
over = 0;
S1SS = 0;
SBUF =numbuf;
while (!over); //µÈ´ý128¸öÊý¾Ý´«ÊäÍê³É
S1SS = 1;
}
void uart1_isr() interrupt UART1_VECTOR
{
if (TI)
{
TI = 0;
if (rptr < 2)
{
SBUF = numbuf;
}
else
{
over = 1;
}
}
if (RI)
{
RI = 0;
P51=1;
}
}
我用软件模拟的SPI也测试过了,可以正常收发 有大佬给看一下吗? 所以你的Spi配置的是主机还是从机模式? 电子DIY小家 发表于 2023-8-4 10:34
所以你的Spi配置的是主机还是从机模式?
主机模式,不过我调试的时候,主机从机都配置试了一下
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