Почему возвращаются данные 0 на STM32? - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь понять, SPI работает хорошо или нет.Поэтому я отправляю некоторые данные из другой функции.Например:

BSP_SPI1SendByte(0x7A);

И чем, если я отлаживаю свой код:

uint8_t BSP_SPI1SendByte(uint8_t byte)
{
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //wait buffer empty

  SPI_I2S_SendData(SPI1, byte); //send data

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); // wait finishing send

  uint8_t data = 0;
  data = SPI_I2S_ReceiveData(SPI1);
  return data;

}

После отладки:

return data=0

Почемуэто значение данных 0?Как это работает с функцией BSP_SPI1SendByte()?

SPI_Conf:

 void BSP_ConfigSPI1(void)
{
    SPI_InitTypeDef SPI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    // /* Enable SPI1 and GPIOA clocks */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    /* SPI1 configuration */
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; // 72Mhz / 4 = 18Mhz --> ENC28J60 SPI OK
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI1, &SPI_InitStructure);

    /* Enable SPI1  */
    SPI_Cmd(SPI1, ENABLE);

Получение:

uint16_t SPI_I2S_ReceiveData(SPI_TypeDef *SPIx)
{
  /* Check the parameters */
  assert_param(IS_SPI_ALL_PERIPH(SPIx));

  /* Return the data in the DR register */

  return SPIx->DR;
}

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Не могу поместить это в комментарии.Но я дам несколько советов.сначала проверьте CPOL, SPI_CPHA, SPI_NSS (CS).

Вы настраиваете управление CS с помощью программного обеспечения, ваши подчиненные аспекты будут контролироваться через вывод CS или нет ??Кроме того, вы знаете, как настроены ваши ведомые регистры SPI CPHA, CPOL?Если ведомый SPI имеет разные настройки SPOL, CPHA, это также может быть причиной, по которой он не работает.Как я уже читал в некоторых комментариях, вы используете enc28j60.

Таблица данных гласит:

" Перед получением каких-либо пакетов приемный буфер должен быть инициализирован путем программирования указателей ERXST и ERXND."Вы должны узнать, как это сделать правильно.Кроме того, для работы этого чипа требуется тактовый вход 25 МГц.И максимальная скорость SPI может поддерживать 20 МГц.Убедитесь, что вы выполнили эти условия.

Также было бы хорошо отладить с помощью осциллографа.Если у вас нет осциллографа, попробуйте запустить другой модуль SPI на том же чипе (stm32) в качестве ведомого устройства и установить те же параметры CPOL, CPHA и CS, что и у вашего основного SPI.По крайней мере, вы начнете с SPI со стороны мастера.Точно прочитайте таблицу данных enc28J60 и попробуйте отправить на нее пакеты, когда вы тестируете ваш мастер SPI.С первого взгляда enc28J60 выглядит довольно сложным чипом.

0 голосов
/ 07 декабря 2018

Похоже, вы не подключили периферийные устройства или неправильно настроили интерфейс SPI?Можете ли вы увидеть отправленные данные в области (MOSI - контактный)?Сама функция отправляет байт и одновременно получает байт от контакта MISO.

...