|
STM32F103, SPI master output |
|
|
|
Apr 13 2014, 05:58
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 17-06-12
Пользователь №: 72 370

|
Здравствуйте друзья! Нужна помощь в поимке особо опасной ошибки, скрывающейся в глубинах моего кода. Пытаюсь настроить SPI в режиме мастера и передать простой код. При отладке в KEIL'е все регистры встают на место, а вот при попытке записать данные в SPI1-DR ничего не происходит: регистр как был пустой, так и остался. Пытался брать примеры из интернета - тоже не отсылается ничего. Спасибо! P.S. хотелось бы реализовать всё без std_periph CODE #include "stm32f10x.h" void InitAll(void);
void InitAll(void) { //Clock source RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //Initial GPIO //SPI1_NSS alternate output push-pull GPIOB->CRH &=~GPIO_CRH_CNF12; GPIOB->CRH |=GPIO_CRH_CNF12_1; GPIOB->CRH &=~GPIO_CRH_MODE12; GPIOB->CRH |=GPIO_CRH_MODE12_1 | GPIO_CRH_MODE12_0; //SPI1_SCK alternate output push-pull GPIOB->CRH &=~GPIO_CRH_CNF13; GPIOB->CRH |=GPIO_CRH_CNF13_1; GPIOB->CRH &=~GPIO_CRH_MODE13; GPIOB->CRH |=GPIO_CRH_MODE13_1 | GPIO_CRH_MODE13_0; //SPI1_MISO input with pull-up/down GPIOB->CRH &=~GPIO_CRH_CNF14;
GPIOB->CRH |=GPIO_CRH_CNF14_1; GPIOB->CRH &=~GPIO_CRH_MODE14; //SPI1_MOSI alternate output push-pull GPIOB->CRH &=~GPIO_CRH_CNF15; GPIOB->CRH |=GPIO_CRH_CNF15_1; GPIOB->CRH &=~GPIO_CRH_MODE15; GPIOB->CRH |=GPIO_CRH_MODE15_1 | GPIO_CRH_MODE15_0; //SPI1_INIT SPI1->CR1 |=SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_SPE;
}
int __main(void) { InitAll(); while(1) { SPI1->DR =0xFF; } }
Сообщение отредактировал IgorKossak - Apr 13 2014, 14:15
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
 |
Ответов
(1 - 13)
|
Apr 13 2014, 06:29
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 17-06-12
Пользователь №: 72 370

|
Цитата(adnega @ Apr 13 2014, 10:10)  Так нельзя! Нужно записывать в DR только когда передатчик пуст. Проверяйте флаг перед записью. Изменил код, всё равно не работает CODE #include "stm32f10x.h" void InitAll(void);
void InitAll(void) { //Clock source RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //Initial GPIO //SPI1_NSS alternate output push-pull GPIOB->CRH &=~GPIO_CRH_CNF12; GPIOB->CRH |=GPIO_CRH_CNF12_1; GPIOB->CRH &=~GPIO_CRH_MODE12; GPIOB->CRH |=GPIO_CRH_MODE12_1 | GPIO_CRH_MODE12_0; //SPI1_SCK alternate output push-pull GPIOB->CRH &=~GPIO_CRH_CNF13; GPIOB->CRH |=GPIO_CRH_CNF13_1; GPIOB->CRH &=~GPIO_CRH_MODE13; GPIOB->CRH |=GPIO_CRH_MODE13_1 | GPIO_CRH_MODE13_0; //SPI1_MISO input with pull-up/down GPIOB->CRH &=~GPIO_CRH_CNF14;
GPIOB->CRH |=GPIO_CRH_CNF14_1; GPIOB->CRH &=~GPIO_CRH_MODE14; //SPI1_MOSI alternate output push-pull GPIOB->CRH &=~GPIO_CRH_CNF15; GPIOB->CRH |=GPIO_CRH_CNF15_1; GPIOB->CRH &=~GPIO_CRH_MODE15; GPIOB->CRH |=GPIO_CRH_MODE15_1 | GPIO_CRH_MODE15_0; //SPI1_INIT SPI1->CR1 |=SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_SPE;
}
int __main(void) { InitAll();
while(1) { SPI1->DR =0xF0; while(SPI1->SR & SPI_SR_BSY); } } тут ещё вот что интересно. На осциллографе все ноги молчат замертво, нет ни SCK ни MISO. SS тоже 0
Сообщение отредактировал IgorKossak - Apr 13 2014, 14:15
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Apr 13 2014, 07:01
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 17-06-12
Пользователь №: 72 370

|
Цитата(Сергей Борщ @ Apr 13 2014, 10:54)  Не вижу включения тактирования SPI Исправил. Реакции нет. Как при программной отладке, так и на осциллографе CODE #include "stm32f10x.h" void InitAll(void);
void InitAll(void) { //Clock source RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //Initial GPIO //SPI1_NSS alternate output push-pull GPIOB->CRH &=~GPIO_CRH_CNF12; GPIOB->CRH |=GPIO_CRH_CNF12_1; GPIOB->CRH &=~GPIO_CRH_MODE12; GPIOB->CRH |=GPIO_CRH_MODE12_1 | GPIO_CRH_MODE12_0; //SPI1_SCK alternate output push-pull GPIOB->CRH &=~GPIO_CRH_CNF13; GPIOB->CRH |=GPIO_CRH_CNF13_1; GPIOB->CRH &=~GPIO_CRH_MODE13; GPIOB->CRH |=GPIO_CRH_MODE13_1 | GPIO_CRH_MODE13_0; //SPI1_MISO input with pull-up/down GPIOB->CRH &=~GPIO_CRH_CNF14;
GPIOB->CRH |=GPIO_CRH_CNF14_1; GPIOB->CRH &=~GPIO_CRH_MODE14; //SPI1_MOSI alternate output push-pull GPIOB->CRH &=~GPIO_CRH_CNF15; GPIOB->CRH |=GPIO_CRH_CNF15_1; GPIOB->CRH &=~GPIO_CRH_MODE15; GPIOB->CRH |=GPIO_CRH_MODE15_1 | GPIO_CRH_MODE15_0; //SPI1_INIT SPI1->CR1 |=SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_SPE;
}
int __main(void) { InitAll();
while(1) { SPI1->DR =0xF0; while(SPI1->SR & SPI_SR_BSY); } }
Сообщение отредактировал IgorKossak - Apr 13 2014, 14:16
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Apr 13 2014, 10:35
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 17-06-12
Пользователь №: 72 370

|
Цитата(adnega @ Apr 13 2014, 14:22)  Неужели SPI1 ремапится на эти ноги (PB12-PB15)? Ккой именно контроллер (полная маркировка)? STM32F103C8T6
|
|
|
|
|
Apr 13 2014, 11:01
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 17-06-12
Пользователь №: 72 370

|
Цитата(adnega @ Apr 13 2014, 14:41)  Смотрим Таблицу 56 RM0008. Для SPI1. При ремап = 0 ноги PA4-PA7 при ремап = 1 ноги PA15, PB3-PB5
У Вас скорее всего SPI2. Вы оказались правы. Я даже не подумал об этом. Пользуюсь отладочной платой Pinboard и бездумно доверился шелкографии на плате. Надо было сразу проверить. Спасибо! Но теперь возникла другая радость: стал проверять сигналы на MOSI и SCK и ужаснулся. У меандров очень сильное перерегулирование на переднем и задних фронтах, плюс на SCK сигнал 1.8 В вместо 3.3. не знаете в чём может быть проблема?
Сообщение отредактировал MySOL - Apr 13 2014, 11:08
|
|
|
|
|
Apr 13 2014, 11:36
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 17-06-12
Пользователь №: 72 370

|
Цитата(adnega @ Apr 13 2014, 15:20)  Попробуйте частоту SPI понизить. Или глубину выборки увеличить (с 10к). У осцилографа какая полоса? 100 МГц полоса. Уменьшение частоты помогло. Частота проца была 72 МГц, соответственно у SPI 36Мгц. Потом сделал 2Мгц. На двух норм. Но неужели железо не позволит теперь делать выше, скажем 10 МГц? Спасибо
Сообщение отредактировал MySOL - Apr 13 2014, 11:38
|
|
|
|
|
Apr 13 2014, 15:19
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(MySOL @ Apr 13 2014, 12:01)  Вы оказались правы. Я даже не подумал об этом. Пользуюсь отладочной платой Pinboard и бездумно доверился шелкографии на плате. Надо было сразу проверить. Спасибо! Но теперь возникла другая радость: стал проверять сигналы на MOSI и SCK и ужаснулся. У меандров очень сильное перерегулирование на переднем и задних фронтах, плюс на SCK сигнал 1.8 В вместо 3.3. не знаете в чём может быть проблема? Не верьте всему, что показывает осциллограф: - как упоминали, надо щуп x10 - щуп надо отстроить (согласовать) на тестовом сигнале (как правило, есть такой выход у осца) вращением подстроечных резисторов - хорошо ли сидит земля щупа на земле платы - щуп есть микроскоп Гейзенберга. Без него выбросов скорее всего нет. Критерием может служить лишь надежность передачи данных.
|
|
|
|
|
Apr 13 2014, 16:28
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 17-06-12
Пользователь №: 72 370

|
Цитата(KnightIgor @ Apr 13 2014, 19:19)  Не верьте всему, что показывает осциллограф: - как упоминали, надо щуп x10 - щуп надо отстроить (согласовать) на тестовом сигнале (как правило, есть такой выход у осца) вращением подстроечных резисторов - хорошо ли сидит земля щупа на земле платы - щуп есть микроскоп Гейзенберга. Без него выбросов скорее всего нет. Критерием может служить лишь надежность передачи данных. Понял, спасибо! Цитата(adnega @ Apr 13 2014, 16:46)  Да хоть 36МГц. Какой делитель на пробнике? Нужен 1:10. Ноги должны быть настроены на вывод на частоте 50МГц (у Вас это так, судя по коду). Попробую, спасибо!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|