Отличия в работе spi STM32F4 и STM32F051. http://stm32f4-discovery.com/2014/06/library-17-nrf24l01-stm32f4xx/
Прикручиваю nrf24L01. За основу взял код отсюда -> Сначала проверил код на 2х Discovery с F407, все заработало. Затем код перенес на F051-й. И тут началось... Не едут и все. Стал смотреть обмен с nrf при помощи логического анализатора. Код практически одинаковый, только подправлен под либы c F4 на F0. Однако что мы видим? Делаем отправку байта 0xA9 (выбран наобум). У F4 и F0501 картинка разная. Почему-то у 051 идет 16 импульсов SCK. И еще MISO изначально LOW (см "A") Смотрим инициализацию
GPIO_InitTypeDef GPIO_InitStruct;
SPI_InitTypeDef SPI_InitStruct;
//Common settings for all pins
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
//Enable clock
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_0);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_0);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_0);
//Pins MISO MOSI SCK
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_13;
GPIO_Init(GPIOB, &GPIO_InitStruct);
SPI_StructInit(&SPI_InitStruct);
SPI_InitStruct.SPI_BaudRatePrescaler = TM_SPI2_PRESCALER;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_FirstBit = TM_SPI2_FIRSTBIT;
SPI_InitStruct.SPI_Mode = TM_SPI2_MASTERSLAVE;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_Init(SPI2, &SPI_InitStruct);
SPI_Cmd(SPI2, ENABLE);
Вроде, все ок. Тогда меняем отправку байта с
NRF24L01_CSN_LOW;
//Send write payload command
TM_SPI_Send(NRF24L01_SPI, 0xA9);
NRF24L01_CSN_HIGH;
на
NRF24L01_CSN_LOW;
//Send write payload command
SPI_SendData8(SPI2, 0xA9);
NRF24L01_CSN_HIGH;
и о чудо! SCK имеет 8 импульсов вместо 16. Идем смотреть TM_SPI_Send. Вот он
uint8_t TM_SPI_Send(SPI_TypeDef* SPIx, uint8_t data) {
/* Fill output buffer with data */
SPIx->DR = data;
//SPI_SendData8(SPIx, data);
/* Wait for transmission to complete */
while (!SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE));
/* Wait for received data to complete */
while (!SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE));
/* Wait for SPI to be ready */
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_BSY));
/* Return data from buffer */
return SPIx->DR;
}
а вот SPI_SendData8
uint32_t spixbase = 0x00;
/* Check the parameters */
assert_param(IS_SPI_ALL_PERIPH(SPIx));
spixbase = (uint32_t)SPIx;
spixbase += 0x0C;
*(__IO uint8_t *) spixbase = Data;
Зачем эти мантры?
spixbase = (uint32_t)SPIx;
spixbase += 0x0C;
И вообще, чем тут разница? Ну кроме ожидания отправки байта и приема ответного?
Прикручиваю nrf24L01. За основу взял код отсюда -> Сначала проверил код на 2х Discovery с F407, все заработало. Затем код перенес на F051-й. И тут началось... Не едут и все. Стал смотреть обмен с nrf при помощи логического анализатора. Код практически одинаковый, только подправлен под либы c F4 на F0. Однако что мы видим? Делаем отправку байта 0xA9 (выбран наобум). У F4 и F0501 картинка разная. Почему-то у 051 идет 16 импульсов SCK. И еще MISO изначально LOW (см "A") Смотрим инициализацию