LCD 0 3 сентября, 2019 Опубликовано 3 сентября, 2019 · Жалоба Здравствуйте. Использую 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); Какая может быть причина? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zeal0t 0 3 сентября, 2019 Опубликовано 3 сентября, 2019 · Жалоба основная функция PB4 - RST для JTAG. если пробуете под отладчиком то его нужно или отключать если не используется и еще, возможно, перемаппировать с отладочной ноги на GP/AF ногу Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LCD 0 3 сентября, 2019 Опубликовано 3 сентября, 2019 · Жалоба Естественно, я менял значение GPIOB->AFR[0] для SPI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 4 сентября, 2019 Опубликовано 4 сентября, 2019 · Жалоба 11 часов назад, LCD сказал: Какая может быть причина? Мне лень проверять все регистры, но такое обилие оператора "|=" чисто интуитивно вызывает большое подозрение. 8 часов назад, LCD сказал: Естественно, я менял значение GPIOB->AFR[0] для SPI. А что ещё так же естественно меняешь? Весь код инициализации секретен? Ну там тактирование порта B, например? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LCD 0 4 сентября, 2019 Опубликовано 4 сентября, 2019 · Жалоба Мне и весь недописанный код не жалко выложить. 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); } Другие порты я инициализировал и проверял в отладчике. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LCD 0 10 сентября, 2019 Опубликовано 10 сентября, 2019 · Жалоба Перепроверил код с использованием разных SPI на разрабатываемом устройстве и на отладочной плате Olimex с F405. На отладочной плате всё работает идеально - и читает, и пишет, последовательность установки бит в CR1 не важна. На устройстве как бы удалось запустить чтение, если одновременно установить биты CPOL и CPHA. Ещё есть какая-то закономерность с последовательностью установки бит в CR1, но я её целенаправленно не исследовал. Быстрые данные (десятки кГц на SCK) дают ноль в DR, хотя ёмкость у линий для такой частоты никакая и на осциллографе всё чётко. Если повесить MISO на Vcc, то в DR будет 254 или 65534, т. е. один бит всегда теряется. Проверял на SPI1 и SPI2. В первом сообщении я написал "Если повесить АЦП на SPI2 или SPI3 - всё нормально работает" из-за того, что перепроверял код на отладочных платах. После недели безуспешной возни начинают закрадываться подозрения в неисправности или поддельности контроллера, т. к. маркировка у него еле заметная по сравнению с чёткой маркировкой "нормальных" STM, но не думаю, что китайцам выгодно подделывать такой маловостребованный вариант контроллера, а с другой стороны, удивило, что он стоил дешевле более простого F407. Есть у кого какие-нибудь мысли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 10 сентября, 2019 Опубликовано 10 сентября, 2019 · Жалоба Так если "смотрели осциллографом", то неужто по нему не видно причину - почему принимается "0"? Если есть разница выполнения с отладочной платой, то можно бросить провода с МК на отладке к АЦП на "боевой" плате и проверить так. А потом наоборот: провода с "боевого" МК - к АЦП на отладочной плате. Ещё можно поотключать всю работу с периферией, которая есть на "боевой" плате, но которой нет на отладке - возможно есть интерференция с ней. PS: А вообще adc_hv_init() - как-то очень всё топорно и коряво.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LCD 0 10 сентября, 2019 Опубликовано 10 сентября, 2019 (изменено) · Жалоба 1 hour ago, jcxz said: Так если "смотрели осциллографом", то неужто по нему не видно причину - почему принимается "0"? Абсолютно не видно, т. к. MISO висит на Vcc, а на SCK идут нормальные пачки импульсов. 1 hour ago, jcxz said: Ещё можно поотключать всю работу с периферией, которая есть на "боевой" плате, но которой нет на отладке - возможно есть интерференция с ней. Попробовал, не помогло. Завтра буду перепаивать камень. Изменено 10 сентября, 2019 пользователем LCD P.S. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 11 сентября, 2019 Опубликовано 11 сентября, 2019 · Жалоба 12 часов назад, LCD сказал: Абсолютно не видно, т. к. MISO висит на Vcc, а на SCK идут нормальные пачки импульсов. Не понял - что именно не видно и почему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LCD 0 13 сентября, 2019 Опубликовано 13 сентября, 2019 · Жалоба Заменил контроллер на новый, всё заработало как надо. Очень подозреваю, что китайцы учатся подделывать и "большие" STM32. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 сентября, 2019 Опубликовано 14 сентября, 2019 · Жалоба 9 часов назад, LCD сказал: Заменил контроллер на новый, всё заработало как надо. Очень подозреваю, что китайцы учатся подделывать и "большие" STM32. Покупать комплектацию нужно у надёжных продаванов, а не у тех, кто отбраковку со свалок продаёт. Тогда и не будут "китайцы подделывать"... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 25 сентября, 2019 Опубликовано 25 сентября, 2019 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 25 сентября, 2019 Опубликовано 25 сентября, 2019 · Жалоба 5 часов назад, Tarbal сказал: Пару лет назад я имел проблемы с SPI вроде тот же процессор. В конце я нашел, что в контроллере дефект. Позже вышел errata sheet, где все было описано. Я в этом форуме писал. Поищите мои сообщения там есть ссылка на errata sheet. У меня сейчас на STM32F429ZIT6 работает проект. SPI1 я там использовал. Для работы с SPI-FLASH. Проблем с ним не было никогда. Плата сделана более 5 лет назад, так что ревизия МК там явно не последняя. Так что - крайне маловероятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться