SPI loopback тест не работает при физическом соединении MISO и MOSI, работает при выставлении бита LBM. Очевидно, что проблема в настройках портов?
Решил тестировать SPI без использования осциллографа, так как постоянного доступа к нему нет. При последней проверке осциллографом, SPI на соответствующих выходах обнаружен не был.
При выставлении битика LBM- SPI при таких же настройках работает. Получает тоже, что и пересылает. Понятно, что это не имеет отношения к портам, соединение на уровне кристалла. Отсюда - логичное предположение. Хотя, настройки портов достаточно простые, непонятно где может быть косяк. Либо все не так просто и нужно что-то дополнительно делать при физическом соединении.
Из оборудования у меня отладка: https://ldm-systems.ru/product/19013
установленная на базовую: https://ldm-systems.ru/product/20001
Схема - https://ldm-systems.ru/f/doc/catalog/LDM-HELPER-K1986BE4-FULL/Sch_LDM-HELPER-K1986BE4.pdf.
SPI пытаюсь выводить на контакты X1:56 - X1:58. Замкнули 57 и 58.
Есть какие-нибудь идеи и предположения?
Код:
void spi_init(void)
{
UART_send_string("SSP init start\r\n");
RST_CLK_PCLKcmd((RST_CLK_PCLK_RST_CLK | RST_CLK_PCLK_SSP1 | RST_CLK_PCLK_PORTA), ENABLE);
PORT_DeInit(MDR_PORTA);
PORT_InitStructure.PORT_FUNC = PORT_FUNC_MAIN;
PORT_InitStructure.PORT_Pin = (PORT_Pin_13 | PORT_Pin_15);
PORT_InitStructure.PORT_OE = PORT_OE_OUT;
PORT_Init(MDR_PORTA, &PORT_InitStructure);
PORT_InitStructure.PORT_Pin = PORT_Pin_14;
PORT_InitStructure.PORT_OE = PORT_OE_IN;
PORT_Init(MDR_PORTA, &PORT_InitStructure);
SSP_DeInit(MDR_SSP1);
SSP_BRGInit(MDR_SSP1, SSP_HCLKdiv8);
SSP_StructInit(&sSSP);
sSSP.SSP_SCR = 0x10; //15…8 SCR SSPx->CR0 32
sSSP.SSP_CPSDVSR = 2; //SSPx->CPSR = 10; 7…0 CPSDVSR (2 .. 254)
sSSP.SSP_Mode = SSP_ModeMaster; //SSPCR1 SSPx->CR1
sSSP.SSP_WordLength = SSP_WordLength16b; //SSPCR0 SSPx->CR0 15
sSSP.SSP_SPH = SSP_SPH_1Edge; //SSPCR0 SSPx->CR0
sSSP.SSP_SPO = SSP_SPO_Low; //SSPCR0 SSPx->CR0
sSSP.SSP_FRF = SSP_FRF_SPI_Motorola; //SSPCR0 SSPx->CR0 = 00010000 00001111
// sSSP.SSP_HardwareFlowControl = SSP_HardwareFlowControl_LBM;
SSP_Init(MDR_SSP1, &sSSP);
SSP_Cmd(MDR_SSP1, ENABLE);
UART_send_string("SSP init finish \r\n\n");
UART_send_port_settings();
int i = 0;
while(i <= 20) {
UART_send_string_("SENT: %d\r\n", i);
SSP_SendData(MDR_SSP1, i++);
delay_short(Del_5_us);
uint16_t res = SSP_ReceiveData(MDR_SSP1);
UART_send_string_("RCVD: %d\r\n\n", res);
}
}
void SSP_SendData(MDR_SSP_TypeDef* SSPx, uint16_t Data)
{
/* Check the parameters */
assert_param(IS_SSP_ALL_PERIPH(SSPx));
/* Transmit Data */
SSPx->DR = Data;
}
uint16_t SSP_ReceiveData(MDR_SSP_TypeDef* SSPx)
{
/* Check the parameters */
assert_param(IS_SSP_ALL_PERIPH(SSPx));
/* Receive Data */
return ((uint16_t)(SSPx->DR));
}
Вывод в терминал:
SSP init start
SSP init finish
PORT REGISTERS:
MDR_PORTA->OE:
Hex: 0xA000
Bin: 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
MDR_PORTA->FUNC:
Hex: 0x54000000
Bin: 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
SENT: 0
RCVD: 65535
SENT: 1
RCVD: 65535
SENT: 2
RCVD: 65535
.................
SENT: 19
RCVD: 65535
SENT: 20
RCVD: 65535