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; //使能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[rptr++]; //启动数据传输 while(!over); //等待128个数据传输完成 S1SS= 1;
ret = 0x5a; for (i=0; i<128; i++) { if(buffer1 != buffer2) //校验数据 { ret = 0xfe; break; } } P6= ret; //P6=0x5a表示数据传输正确 }
|