Код
void SSP1Send( BYTE *buf, DWORD Length )
{
DWORD i;
for ( i = 0; i < Length; i++ )
{
/* as long as TNF bit is set (TxFIFO is not full), I can always transmit */
while ( !(SSP1SR & SSPSR_TNF) );
SSP1DR = *buf;
buf++;
/* Wait until the Busy bit is cleared */
while ( !(SSP1SR & SSPSR_BSY) );
}
return;
}
void SSP1Receive( BYTE *buf, DWORD Length )
{
DWORD i;
for ( i = 0; i < Length; i++ )
{
/* As long as Receive FIFO is not empty, I can always receive. */
/* since it's a loopback test, clock is shared for both TX and RX,
no need to write dummy byte to get clock to get the data */
/* if it's a peer-to-peer communication, SSPDR needs to be written
before a read can take place. */
SSP1DR = 0xFF;
while ( !(SSP1SR & SSPSR_RNE) );
*buf = SSP1DR;
buf++;
}
return;
}
...
for (n = 0; n < 3; n++) {
UART_printf(0,"Try readback ID from DataFlash: ");
data_send[0]=0x9f;
SSP1Send(data_send,1);
FIO4CLR = 1<<21;
SSP1Receive(data_recv,7);
FIO4SET = 1<<21;
TFT_printf(0,"Read: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x \n\r",data_recv[0],data_recv[1],data_recv[2],data_recv[3],data_recv[4],data_recv[5],data_recv[6]);
}
{
DWORD i;
for ( i = 0; i < Length; i++ )
{
/* as long as TNF bit is set (TxFIFO is not full), I can always transmit */
while ( !(SSP1SR & SSPSR_TNF) );
SSP1DR = *buf;
buf++;
/* Wait until the Busy bit is cleared */
while ( !(SSP1SR & SSPSR_BSY) );
}
return;
}
void SSP1Receive( BYTE *buf, DWORD Length )
{
DWORD i;
for ( i = 0; i < Length; i++ )
{
/* As long as Receive FIFO is not empty, I can always receive. */
/* since it's a loopback test, clock is shared for both TX and RX,
no need to write dummy byte to get clock to get the data */
/* if it's a peer-to-peer communication, SSPDR needs to be written
before a read can take place. */
SSP1DR = 0xFF;
while ( !(SSP1SR & SSPSR_RNE) );
*buf = SSP1DR;
buf++;
}
return;
}
...
for (n = 0; n < 3; n++) {
UART_printf(0,"Try readback ID from DataFlash: ");
data_send[0]=0x9f;
SSP1Send(data_send,1);
FIO4CLR = 1<<21;
SSP1Receive(data_recv,7);
FIO4SET = 1<<21;
TFT_printf(0,"Read: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x \n\r",data_recv[0],data_recv[1],data_recv[2],data_recv[3],data_recv[4],data_recv[5],data_recv[6]);
}
В соответствии с даташитом ответ должен быть такой: 0x1f 0x27 0x1 0x0
На практике имеем следующее:
Код
Try readback ID from DataFlash:
Read: 0xff 0x1f 0x27 0x1 0x0 0x0 0x0
Try readback ID from DataFlash:
Read: 0xff 0xff 0x1f 0x27 0x1 0x0 0x0
Try readback ID from DataFlash:
Read: 0xff 0xff 0x1f 0x27 0x1 0x0 0x0
Read: 0xff 0x1f 0x27 0x1 0x0 0x0 0x0
Try readback ID from DataFlash:
Read: 0xff 0xff 0x1f 0x27 0x1 0x0 0x0
Try readback ID from DataFlash:
Read: 0xff 0xff 0x1f 0x27 0x1 0x0 0x0
Логический анализатор показал, что все нормально, на нем этих 0xff нет (точнее есть один, в момент получения команды). Откуда берутся эти "мусорные" байты?