Hi Kerry,
Thanks you.
I have solve the problems.
The problem, CS abnormal 0->1->0 , results from forgeting to connect Logic Analyzer's GND to Slave &Master board.
But wrong SPI bytes sequence stiil exists. For example, I want to send 0x55 0x80 0xAA by MISO, but it sends 0xAA 0x55 0x80 actually.
I think it relates to SPI tx buffer & data register 's rule. I find out I can load 2 bytes into TX buffer register before reading any data from RX buffer register, if I use interrupt.
A valid way is restricting the Tx and Rx sequence to TX&RX buffer.
Key Point:
1. Use Tx&Rx interrupts, do not disable.
2. Should be load 1 byte to Tx buffer for wating for Tx first.
2. When Tx finish loading 1 byte, pls to change to waiting for Rx 1byte.
e.g. Main Code
typedef enum
{
SPI_BYTES_STATUS_HEADER_BEGIN,
SPI_BYTES_STATUS_HEADER_END,
SPI_BYTES_STATUS_SECOND_BEGIN,
SPI_BYTES_STATUS_SECOND_END,
SPI_BYTES_STATUS_TAIL_BEGIN,
SPI_BYTES_STATUS_TAIL_END
}SPI_BYTES_STATUS_Type;
volatile SPI_BYTES_STATUS_Type spiBytesStatus = SPI_BYTES_STATUS_HEADER_BEGIN;
void SPISlave_CallBack()
{
if(SPI_IsSPRF(SPI1))
{// Rx full
switch(spiBytesStatus)
{
case SPI_BYTES_STATUS_HEADER_END:
gu8SPI1_RxBuff[0] = SPI_ReadDataReg(SPI1);
spiBytesStatus = SPI_BYTES_STATUS_SECOND_BEGIN;
break;
case SPI_BYTES_STATUS_SECOND_END:
gu8SPI1_RxBuff[1] = SPI_ReadDataReg(SPI1);
spiBytesStatus = SPI_BYTES_STATUS_TAIL_BEGIN;
break;
case SPI_BYTES_STATUS_TAIL_END:
gu8SPI1_RxBuff[2] = SPI_ReadDataReg(SPI1);
spiBytesStatus = SPI_BYTES_STATUS_HEADER_BEGIN;
u32SPI1_RxFrameCnt ++;
break;
}
u32SPI1_RxCnt ++;
}
if(SPI_IsSPTEF(SPI1))
{// Tx empty
switch(spiBytesStatus)
{
case SPI_BYTES_STATUS_HEADER_BEGIN:
SPI_WriteDataReg(SPI1, gu8SPI1_TxBuff[0]);
spiBytesStatus = SPI_BYTES_STATUS_HEADER_END;
break;
case SPI_BYTES_STATUS_SECOND_BEGIN:
SPI_WriteDataReg(SPI1, gu8SPI1_TxBuff[1]);
spiBytesStatus = SPI_BYTES_STATUS_SECOND_END;
break;
case SPI_BYTES_STATUS_TAIL_BEGIN:
SPI_WriteDataReg(SPI1, gu8SPI1_TxBuff[2]);
spiBytesStatus = SPI_BYTES_STATUS_TAIL_END;
u32SPI1_TxFrameCnt ++;
break;
}
u32SPI1_TxCnt ++;
}
}
main()
{
while(1)
{
//void SPISlave_Task(){
gu8SPI1_TxBuff[0] = 0x55;
gu8SPI1_TxBuff[1] = 0x80;
gu8SPI1_TxBuff[2] = 0xAA;
//}
}
}