Код
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_SPI );
AT91F_SPI_Disable(AT91C_BASE_SPI);
AT91F_SPI_Reset(AT91C_BASE_SPI);
AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_PS_FIXED | AT91C_SPI_MODFDIS);
AT91F_SPI_CfgCs(AT91C_BASE_SPI,
0,
AT91C_SPI_BITS_16 |
((50 << 8) & AT91C_SPI_SCBR) //Serial Clock Baud Rate ?????
);
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_SPI, SPI_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE, spi_irq_handler);
AT91F_SPI_EnableIt (AT91C_BASE_SPI, AT91C_SPI_RDRF);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SPI);
AT91F_SPI_Enable(AT91C_BASE_SPI);
AT91F_SPI_Disable(AT91C_BASE_SPI);
AT91F_SPI_Reset(AT91C_BASE_SPI);
AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_PS_FIXED | AT91C_SPI_MODFDIS);
AT91F_SPI_CfgCs(AT91C_BASE_SPI,
0,
AT91C_SPI_BITS_16 |
((50 << 8) & AT91C_SPI_SCBR) //Serial Clock Baud Rate ?????
);
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_SPI, SPI_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE, spi_irq_handler);
AT91F_SPI_EnableIt (AT91C_BASE_SPI, AT91C_SPI_RDRF);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SPI);
AT91F_SPI_Enable(AT91C_BASE_SPI);
Прерывание:
Код
void spi_irq_handler(){
unsigned int status = AT91C_BASE_SPI->SPI_SR;
if (status & AT91C_SPI_RDRF)
{
debug_cnt++;
ssc_buf_in[0] = ssc_buf_in[1];
ssc_buf_in[1] = ssc_buf_in[2];
ssc_buf_in[2] = AT91C_BASE_SPI->SPI_RDR;
}
}
unsigned int status = AT91C_BASE_SPI->SPI_SR;
if (status & AT91C_SPI_RDRF)
{
debug_cnt++;
ssc_buf_in[0] = ssc_buf_in[1];
ssc_buf_in[1] = ssc_buf_in[2];
ssc_buf_in[2] = AT91C_BASE_SPI->SPI_RDR;
}
}
Передается последовательно 0xAA55, 0xAA56, 0xAA57. Смотрел осциллографом - все четко.
Принимается каша. При каждом запуске - разное. Причем такое впечатление, что начинает
вдвигаться в регистр SPI слово не с первого байта, а со случайного. В результате в приемном буфере
может оказаться, например 12 последних бит первого слова и 4 бита второго.
Передача идет на частоте 100КГц. Режимы передатчика и приемника совпадают.
Иногда, очень редко, все работает правильно.
В чем могут быть грабли?