我的SPI 发送波形已经出来,没发现有问题,对方应答的也有相应的波形,但我从接收读出的数据与 应答数据不一至,请帮忙分析一下。
初始化如下:
EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0; //
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0; //
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0; //
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0; //
GpioCtrlRegs.GPBQSEL2.bit.GPIO58= 3; //
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; //
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; //
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; //
GpioCtrlRegs.GPBGMUX2.bit.GPIO58=3;
GpioCtrlRegs.GPBGMUX2.bit.GPIO59=3;
GpioCtrlRegs.GPBGMUX2.bit.GPIO60=3;
GpioCtrlRegs.GPBGMUX2.bit.GPIO61=3;
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; //
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; //
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; //
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3; //
EDIS;
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all = 0xE041;
SpiaRegs.SPIFFRX.all = 0x2061;
SpiaRegs.SPIFFCT.all = 0x0;
// —————————————————————————————
// Initialize SPI-A
SpiaRegs.***.bit.SPISWRESET = 0;
SpiaRegs.***.bit.CLKPOLARITY = 0;
SpiaRegs.***.bit.HS_MODE=1;
SpiaRegs.***.bit.*** = 7; // 1 byte
SpiaRegs.***.bit.SPILBK = 0; // 2
SpiaRegs.***.bit.MASTER_SLAVE = 1;// 主模式 SpiaRegs.***.bit.TALK = 1; // 发送使能 SpiaRegs.***.bit.CLK_PHASE = 0; // 上升 SpiaRegs.***.bit.SPIINTENA = 0;
// Set the baud rate
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;
// Set FREE bit
// Halting on a breakpoint will not halt the SPI
SpiaRegs.SPIPRI.bit.FREE = 1;
// Release the SPI from reset
SpiaRegs.***.bit.SPISWRESET = 1;
// ————–以下是发送 ———————————–
uint16 SPI_Send_byte(unsigned char byte_s)
{
uint16 uiData;
volatile uint32 k=0;
while((SpiaRegs.SPISTS.bit.BUFFULL_FLAG)&&(k<SPI_WTIME)) //Wait for room to write data
{ k++;
if(k>=SPI_WTIME)
{
break;
}
}
if(k>=SPI_WTIME)
{
return(0x8000);
}
// ok ————————–
uiData=byte_s;
uiData=uiData &0x00ff;
SpiaRegs.SPITXBUF = uiData<<8;
return(0); /* Return received value */
}
// 以下为接收——————————
//———————————————————————————
/*******************************************************************************
* Function Name : SPI_Read_byte
* Description : Send one byte then recv one byte of response
* Input : – byte_s: byte_s
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
uint16 SPI_Read_byte(void)
{
unsigned char byte_r;
uint16 uiData;
volatile uint32 k=0;
while((SpiaRegs.SPISTS.bit.BUFFULL_FLAG)&&(k<SPI_WTIME)) // 发送前 先判断是否可以发送
{
// 不可以发送时 ,超时计时处理
k++;
if(k>=SPI_WTIME)
{
break;
}
}
if(k>=SPI_WTIME)
{ // 超时即退出
return(0x8000);
}
// 接收前清理一次接收标记 ————————–
uiData =SpiaRegs.SPIRXBUF;
SpiaRegs.SPIFFRX.bit.RXFIFORESET=0;
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;
SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;
SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
// —–发送读时钟—————————————-
SpiaRegs.SPITXBUF = 0xff00;
k=0;
// while( (SpiaRegs.SPISTS.bit.INT_FLAG!=1)&&(k<SPI_WTIME)) // 采用接收状态位判断 试过了 不行
// while( (SpiaRegs.SPIFFRX.bit.RXFFINT!=1)&&(k<SPI_WTIME))// 采用接收中断位判断 试过了 不行
while((SpiaRegs.SPIFFRX.bit.RXFFST<1)&&(k<SPI_WTIME)) // 采用FIFO数据判断, 试过了也 不行
{
k++;
if(k>=SPI_WTIME)
{
break;
}
}
if(k>=SPI_WTIME)
{ uiData =SpiaRegs.SPIRXBUF;
return(0x8000);
}
uiData =SpiaRegs.SPIRXBUF;
byte_r = uiData &0xff;
return byte_r; /* Return received value */
}