ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
22 июля
570605
rod-i-on (06.01.2015 12:15, просмотров: 1890)
Отличия в работе 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; И вообще, чем тут разница? Ну кроме ожидания отправки байта и приема ответного?
image