В даташите говорится просто - словили коллизию - выставился бит. А откуда она (коллизия) может браться - непонятно.
вот моя инициализация и функция передачи (на основе примеров Keil)
Код
void SPIInit( void )
{
TxCounter = 0;
PCONP |= ((U32)1 << 8); /* by default, it's enabled already, for safety reason */
S0SPCR = 0x00;
/* Port 0.15 SPI SCK, port0.17 MISO, port0.18 MOSI */
PINSEL0 &= ~0xC0000000;
PINSEL0 |= 0xC0000000;
PINSEL1 &= ~0x0000003C;
PINSEL1 |= 0x0000003C;
/* Setting SPI0 clock */
S0SPCCR = 0x5A; // 200KHz @ (72MHz/4 CCLK) == PCLK
S0SPCR = SPI0_MSTR | SPI0_LSBF;
return;
}
void SPISend( U8 *buf, U32 Length )
{
U32 i;
volatile U8 Dummy;
if ( Length == 0 )
return;
for ( i = 0; i < Length; i++ )
{
S0SPDR = *buf;
while ( !(S0SPSR & SPIF) );
Dummy = S0SPDR; /* Flush the RxFIFO */
buf++;
}
return;
}
{
TxCounter = 0;
PCONP |= ((U32)1 << 8); /* by default, it's enabled already, for safety reason */
S0SPCR = 0x00;
/* Port 0.15 SPI SCK, port0.17 MISO, port0.18 MOSI */
PINSEL0 &= ~0xC0000000;
PINSEL0 |= 0xC0000000;
PINSEL1 &= ~0x0000003C;
PINSEL1 |= 0x0000003C;
/* Setting SPI0 clock */
S0SPCCR = 0x5A; // 200KHz @ (72MHz/4 CCLK) == PCLK
S0SPCR = SPI0_MSTR | SPI0_LSBF;
return;
}
void SPISend( U8 *buf, U32 Length )
{
U32 i;
volatile U8 Dummy;
if ( Length == 0 )
return;
for ( i = 0; i < Length; i++ )
{
S0SPDR = *buf;
while ( !(S0SPSR & SPIF) );
Dummy = S0SPDR; /* Flush the RxFIFO */
buf++;
}
return;
}
вопрос, собственно, один - откуда коллизия?