Ну вот честное слово, лениво продираться через высосанные из пальца дефайны. Имхо, периферия на NXP документирована достаточно хорошо, чтобы не использовать ещё какие-то дополнительные библиотеки.
Например, неочевидно мне, что тут пишут в CR1. Надо прочитать Ваш исходник, заголовок драйвера и сам драйвер, и только потом смотреть в даташит.
Код
tmp = SSP_ConfigStruct->Mode & SSP_CR1_BITMASK;
// Write back to CR1
SSPx->CR1 = tmp;
Рабочий код обмена с SPI:
Код
#define SPI_REG(reg) SSP1->reg
#define SPI_WAIT_READY() while (SPI_REG(SR) & SPI_SR_BUSY)
// Процедура инициализации (возвращает код ошибки)
dword SPI_Init(void)
{
// устанавливается в стартапе: SSP1 on, PCLK = CCLK
//PCONP |= BIT(10);
//CLKSEL (PCLKSEL0, 1, 20);
SPI_DISABLE_ALL_CHIP();
SPI_REG(CPSR) = 6;
SPI_REG(CR0) = 0x0007;
SPI_REG(IMSC) = 0x0;
SPI_REG(DMACR) = 0x0;
SPI_REG(CR1) = 0x2;
while (SPI_REG(SR) & SPI_SR_RNE)
SPI_REG(DR);
return 0;
}
// Процедура запуска одного цикла работы
dword SPI_Run (dword aSendByte)
{
SPI_REG(DR) = aSendByte;
SPI_WAIT_READY();
return SPI_REG(DR);
}
ChipSelect сконфигурирован как GPIO, остальные ноги - как SSP (в другом модуле, здесь не видно).
После перехода CS low->high рекомендую добавить несколько (я сделал десяток) nop'ов - у контроллера ноги весьма быстрые, память может не "почуствовать" деактивации. Хотя, как я вижу, уже есть delay_ms(1) - это слегка избыточно, но для проверки сойдёт.