今天把昨天没有解决的问题给解决了,在子函数check()里设置每一种通信错误对应的flag,在主函数里调用check(),根据flag的不同,实现不同的操作。
感觉今天改程序的方法和昨天改的方法是差不多的,就是不知道为什么今天成功了昨天不行,可能是今天人品比较好。然后也把几个子函数修改了一下,看着稍微好看一点不那么山寨了。
现在在调那个不通的SPI程序,不知道是不是因为芯片x5043有一套操作方法(就像以前调RS485那样),我漏了什么,所以spi发送过去的数据用串口调试助手读回来的不是原来的SPI发送的值,是00 、05之类的乱七八糟的值, 程序如下:
思路:用串口调试助手发送一字节数据0x30,用SPI向x5043发送这一字节数据,并读回数据return(SPI_SPDR) ,将SPI读回的数据又发送回串口调试助手
#include "config.h"
#define BPS 9600
uint32 SP485_DE=1<<17; //rs485使能
uint32 SPI_CS=1<<24; //x5043使能
uint8 SPI_rcv,Uart_rcv;
void InitSPI(void);
void InitUart(void);
uint8 MSPI_SendByte(uint8 data);
int main (void)
{// add user source code
InitSPI();
InitUart();
while(1)
{
while((U0LSR & 0x01) == 0);//串口调试助手发送一字节数据0x03
Uart_rcv=U0RBR;
SPI_rcv=MSPI_SendByte(Uart_rcv);//SPI发送这一字节数据0x03,并读回(具体见子函数)
IO0SET|=SP485_DE;
U0THR = SPI_rcv; //用串口调试助手接收 SPI读回的数据
while((U0LSR & 0x40) == 0);
IO0CLR|=SP485_DE;
}
return 0;
}
void InitSPI(void)
{
PINSEL0=(PINSEL0&(~(0xff<<8)))|(0x55<<8);//管脚功能选择
SPCCR=0x52; //设置SPI时钟分频
SPCR=(0<<3)|(1<<4)|(1<<5)|(0<<6)|(0<<7);
IO1DIR|=SPI_CS;
IO1CLR|=SPI_CS;
}
uint8 MSPI_SendByte(uint8 data)
{
SPI_SPDR=data;
while(0==(SPI_SPSR&0x80));
return(SPI_SPDR);
}
void InitUart(void)
{
uint16 Fdiv;
PINSEL0=(PINSEL0&(~0x0f))|0x05;
IO0DIR|=SP485_DE;
IO0CLR|=SP485_DE;
U0LCR = 0x83 ;//允许设置波特率
Fdiv = (Fpclk / 16) /BPS;
U0DLM = Fdiv /256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}