Jump to content

    

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

Recommended Posts

LCD

Здравствуйте. Использую 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);
  

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

Share this post


Link to post
Share on other sites

Zeal0t

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

Share this post


Link to post
Share on other sites

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

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

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

 

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

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

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

Share this post


Link to post
Share on other sites

LCD

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

 

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);
}

 

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

Share this post


Link to post
Share on other sites

LCD

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

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

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

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

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

Share this post


Link to post
Share on other sites

jcxz

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

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

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

Share this post


Link to post
Share on other sites

LCD
1 hour ago, jcxz said:

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

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

1 hour ago, jcxz said:

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

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

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

Edited by LCD
P.S.

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

LCD

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Tarbal
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.

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.