Перейти к содержанию
    

STM32F429 - не принимаются данные на SPI1

Здравствуйте. Использую STM32F429IGT, на SPI1 висит АЦП MCP3208. На него подаются запросы от контроллера и они обрабатываются согласно даташиту (смотрел осциллографом), но после выполнения запроса в SPI1->DR всегда 0. Если повесить АЦП на SPI2 или SPI3 - всё нормально работает. Если перевесить MISO с PA6 на PB4 - не работает.

 

  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
  GPIOA->MODER |= GPIO_MODER_MODER4_0 | GPIO_MODER_MODER5_1 | GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1;
  GPIOA->AFR[0] |= 0x55500000;
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR4 | GPIO_OSPEEDER_OSPEEDR5 | GPIO_OSPEEDER_OSPEEDR7;
  
  RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
  SPI1->CR1 |= SPI_CR1_MSTR | SPI_CR1_BR | SPI_CR1_DFF; // master mode, prescaler 255, 16 bit
  SPI1->CR2 |= SPI_CR2_SSOE;
  SPI1->CR2 |= SPI_CR2_RXNEIE;
  SPI1->CR1 |= SPI_CR1_SPE;
  
  NVIC_EnableIRQ (SPI1_IRQn);
  NVIC_SetPriority (SPI1_IRQn, 15);
  

Какая может быть причина?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

основная функция PB4 - RST для JTAG. если пробуете под отладчиком то его нужно или отключать если не используется и еще, возможно, перемаппировать с отладочной ноги на GP/AF ногу

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 часов назад, LCD сказал:

Какая может быть причина?

Мне лень проверять все регистры, но такое обилие оператора "|=" чисто интуитивно вызывает большое подозрение.

 

8 часов назад, LCD сказал:

Естественно, я менял значение GPIOB->AFR[0] для SPI.

А что ещё так же естественно меняешь? Весь код инициализации секретен? Ну там тактирование порта B, например?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне и весь недописанный код не жалко выложить.

 

Spoiler

#include "stm32f4xx.h"
#include <stdbool.h>

#define BSRR BSRRL
#define BRR BSRRH

#define MCP32_START  0x8000
#define MCP32_SINGLE 0x4000
#define MCP32_D2     0x2000
#define MCP32_D1     0x1000
#define MCP32_D0     0x800

static volatile unsigned int hv_request = 0;

static bool adc_hv_spi_request (unsigned int channel)
{
  if (hv_request)
    return false;
  
  hv_request = 1;
  SPI1->DR = channel;
  return true;
}

void adc_hv_refresh ()
{
  if (SPI1->SR & SPI_SR_BSY)
    return;
  if ((SPI1->SR & SPI_SR_TXE) == 0) 
    return;
  GPIOA->BRR = 1 << 4;
  adc_hv_spi_request (MCP32_START | MCP32_SINGLE | MCP32_D2 | MCP32_D1 | MCP32_D0);
}

void SPI1_IRQHandler ()
{
  static unsigned int res;
  while (!(SPI1->SR & SPI_SR_RXNE)) ;
  unsigned int t = SPI1->DR;
  switch (hv_request)
  {
  case 1:
    res = t << 16;
    SPI1->DR = 0;
    hv_request = 2;
    break;
  case 2:
    res |= t;
    GPIOA->BSRR = 1 << 4;
    hv_request = 0;
    break;
  default:
    break;
  }
}

void adc_hv_init ()
{
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
  GPIOA->MODER |= GPIO_MODER_MODER4_0 | GPIO_MODER_MODER5_1 | GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1;
  GPIOA->AFR[0] |= 0x55500000;
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR4 | GPIO_OSPEEDER_OSPEEDR5 | GPIO_OSPEEDER_OSPEEDR7;
  
  RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
  SPI1->CR1 |= SPI_CR1_MSTR | SPI_CR1_BR | SPI_CR1_DFF; // master mode, prescaler 255, 16 bit
  SPI1->CR2 |= SPI_CR2_SSOE; // ss out enable
  SPI1->CR2 |= SPI_CR2_RXNEIE;
  SPI1->CR1 |= SPI_CR1_SPE; // enable
  
  NVIC_EnableIRQ (SPI1_IRQn);
  NVIC_SetPriority (SPI1_IRQn, 15);
}

 

Другие порты я инициализировал и проверял в отладчике.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Перепроверил код с использованием разных SPI на разрабатываемом устройстве и на отладочной плате Olimex с F405. На отладочной плате всё работает идеально - и читает, и пишет, последовательность установки бит в CR1 не важна.

На устройстве как бы удалось запустить чтение, если одновременно установить биты CPOL и CPHA. Ещё есть какая-то закономерность с последовательностью установки бит в CR1, но я её целенаправленно не исследовал. Быстрые данные (десятки кГц на SCK) дают ноль в DR, хотя ёмкость у линий для такой частоты никакая и на осциллографе всё чётко. Если повесить MISO на Vcc, то в DR будет 254 или 65534, т. е. один бит всегда теряется. Проверял на SPI1 и SPI2.

В первом сообщении я написал "Если повесить АЦП на SPI2 или SPI3 - всё нормально работает" из-за того, что перепроверял код на отладочных платах.

После недели безуспешной возни начинают закрадываться подозрения в неисправности или поддельности контроллера, т. к. маркировка у него еле заметная по сравнению с чёткой маркировкой "нормальных" STM, но не думаю, что китайцам выгодно подделывать такой маловостребованный вариант контроллера, а с другой стороны, удивило, что он стоил дешевле более простого F407.

Есть у кого какие-нибудь мысли?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так если "смотрели осциллографом", то неужто по нему не видно причину - почему принимается "0"?

Если есть разница выполнения с отладочной платой, то можно бросить провода с МК на отладке к АЦП на "боевой" плате и проверить так. А потом наоборот: провода с "боевого" МК - к АЦП на отладочной плате. Ещё можно поотключать всю работу с периферией, которая есть на "боевой" плате, но которой нет на отладке - возможно есть интерференция с ней.

PS: А вообще adc_hv_init() - как-то очень всё топорно и коряво.... :russian_ru:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

Так если "смотрели осциллографом", то неужто по нему не видно причину - почему принимается "0"? 

Абсолютно не видно, т. к. MISO висит на Vcc, а на SCK идут нормальные пачки импульсов.

1 hour ago, jcxz said:

Ещё можно поотключать всю работу с периферией, которая есть на "боевой" плате, но которой нет на отладке - возможно есть интерференция с ней. 

Попробовал, не помогло.

Завтра буду перепаивать камень.

Изменено пользователем LCD
P.S.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 часов назад, LCD сказал:

Абсолютно не видно, т. к. MISO висит на Vcc, а на SCK идут нормальные пачки импульсов.

Не понял - что именно не видно и почему?  :wacko2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заменил контроллер на новый, всё заработало как надо. Очень подозреваю, что китайцы учатся подделывать и "большие" STM32.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, LCD сказал:

Заменил контроллер на новый, всё заработало как надо. Очень подозреваю, что китайцы учатся подделывать и "большие" STM32.

Покупать комплектацию нужно у надёжных продаванов, а не у тех, кто отбраковку со свалок продаёт. Тогда и не будут "китайцы подделывать"...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/3/2019 at 12:25 PM, LCD said:

Здравствуйте. Использую STM32F429IGT, на SPI1 висит АЦП MCP3208. На него подаются запросы от контроллера и они обрабатываются согласно даташиту (смотрел осциллографом), но после выполнения запроса в SPI1->DR всегда 0. Если повесить АЦП на SPI2 или SPI3 - всё нормально работает. Если перевесить MISO с PA6 на PB4 - не работает.

 


  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
  GPIOA->MODER |= GPIO_MODER_MODER4_0 | GPIO_MODER_MODER5_1 | GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1;
  GPIOA->AFR[0] |= 0x55500000;
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR4 | GPIO_OSPEEDER_OSPEEDR5 | GPIO_OSPEEDER_OSPEEDR7;
  
  RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
  SPI1->CR1 |= SPI_CR1_MSTR | SPI_CR1_BR | SPI_CR1_DFF; // master mode, prescaler 255, 16 bit
  SPI1->CR2 |= SPI_CR2_SSOE;
  SPI1->CR2 |= SPI_CR2_RXNEIE;
  SPI1->CR1 |= SPI_CR1_SPE;
  
  NVIC_EnableIRQ (SPI1_IRQn);
  NVIC_SetPriority (SPI1_IRQn, 15);
  

Какая может быть причина?

Пару лет назад я имел проблемы с SPI вроде тот же процессор. В конце я нашел, что в контроллере дефект. Позже вышел errata sheet, где все было описано. Я в этом форуме писал. Поищите мои сообщения там есть ссылка на errata sheet.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, Tarbal сказал:

Пару лет назад я имел проблемы с SPI вроде тот же процессор. В конце я нашел, что в контроллере дефект. Позже вышел errata sheet, где все было описано. Я в этом форуме писал. Поищите мои сообщения там есть ссылка на errata sheet.

У меня сейчас на STM32F429ZIT6 работает проект. SPI1 я там использовал. Для работы с SPI-FLASH. Проблем с ним не было никогда. Плата сделана более 5 лет назад, так что ревизия МК там явно не последняя.

Так что - крайне маловероятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...