реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F103 SPI2
Григорий Ревзин
сообщение Mar 4 2012, 18:23
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 13-01-12
Пользователь №: 69 376



Ребят, такое дело.
Инициализирую SPI2 нижеприведенным кодом. Начинаю пихать туда в цикле значения с задержкой в пару секунд, прерывание TXE срабатывает, но на линиях выхода абсолютно глухо (смотрел осциллографом). Порты проверил отдельно, работают, если тупо выставить высокий уровень через GPIOB->BSRR. В чем может быть дело? Несколько раз всё перепроверял. Значение бита SSI никак не влияет на уровень на линии CS. Заранее большое спасибо.
Код инициализации:

CODE
SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPBEN | RCC_APB2ENR_AFIOEN);
// Включение тактования SPI2.
SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);

// Включение портов SPI:
// PB12 AFO Push-Pull @ 50 МГц (CS)
SET_BIT(GPIOB->CRH, GPIO_CRH_MODE12_0 | GPIO_CRH_MODE12_1 | GPIO_CRH_CNF12_1);
// PB13 AFO Push-Pull @ 50 МГц (SCK)
SET_BIT(GPIOB->CRH, GPIO_CRH_MODE13_0 | GPIO_CRH_MODE13_1 | GPIO_CRH_CNF13_1);
// PB14 AFI Pull-up (MISO)
SET_BIT(GPIOB->CRH, GPIO_CRH_CNF14_1);
// PB14 Pull-up.
SET_BIT(GPIOB->ODR, GPIO_ODR_ODR14);
// PB15 AFO Push-Pull @ 50 МГц (MOSI)
SET_BIT(GPIOB->CRH, GPIO_CRH_MODE15_0 | GPIO_CRH_MODE15_1 | GPIO_CRH_CNF15_1);

// Разрешаем прерывание по приёму и передаче.
SET_BIT(SPI2->CR2, SPI_CR2_RXNEIE | SPI_CR2_SSOE | SPI_CR2_TXEIE);

// SPI Baud = 36 / 4 = 9 МГц(BR = 0b001)
// Приводим поляроность сихнонизирующего сигнала в соотв. с инструкцией AD7799.
// Заставоем отправлять последний бит сначала.
// Включаем ведущего. Зажимаем Chip Select вниз (больше никого нет).
// Включаем часики.
// Включаем автомат SPI.
// По умолчанию размер пакета - 1Б.
SET_BIT(SPI2->CR1, SPI_CR1_CPOL | SPI_CR1_LSBFIRST | SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_BR_0 | SPI_CR1_SPE);

// Разрешаем прерывание.
NVIC_EnableIRQ(SPI2_IRQn);


Код, пихающий значения:
CODE

while (1) {
Delay(10000000);
SPI2->DR = 0xF;
}
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 4 2012, 18:50
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Всё правильно вроде... В плане танцев с бубном попробуйте сделать вот что:
1. Уберите SPI_CR2_SSOE, оно всё равно не работает.
2. Замените SET_BIT(SPI2->CR2,... на SPI2->CR2 = ...
3. То же самое для SPI2->CR1.
4. Ну и в инициализации портов GPIO посмотрите, не надо ли где-нибудь сначала сделать CLEAR_BIT, перед SET_BIT. Чтобы не зависеть от текущего состояния.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Григорий Ревзин
сообщение Mar 4 2012, 20:22
Сообщение #3





Группа: Новичок
Сообщений: 4
Регистрация: 13-01-12
Пользователь №: 69 376



Точно, спасибо огромное 08.gif , верное замечание - #4.
У GPIOx->CRH подефолту стоит
Port configuration register high (GPIOx_CRH) (x=A..G)
Address offset: 0x04
Reset value: 0x4444 4444 <--- !!!! (0b....100100 -> Floating Input).
Поэтому, когда я ORил их с мне нужными настройками... Что-то там не то получалось...




Так, нет, не всё...
SPI2 теперь инициализируется так:
SPI2->CR1 = 0xDE;
SPI2->CR2 = 0x40;
И оно правильно работает.
Но, если выключить питание, а потом включить, то в SPI2->CR1 почему-то лежит 0x9A. До строки SPI2->CR1 = 0xDE; там 0x00, после - 0x9A. Смотрел через отладочный вывод через UART, потому что если пошагово выполнять программу через JTAG, то всё без ошибок. (Соответственно, ничего не работает.) Что это за такое?! Сразу после прошивки контроллера всё хорошо, до выключения питания...

Если оставить подключенным (в смысле, не выходить в KEIL из DEBUG MODE) отладчик и передернуть питание, то всё нормально. Если выйти и перезапустить, там почему-то 0x9A.

Проблема решилась. Добавил перед инициализацией SPI2 задержку в пару миллионов NOP'ов, теперь записывается то, что надо.

Сообщение отредактировал Григорий Ревзин - Mar 4 2012, 20:15
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01363 секунд с 7
ELECTRONIX ©2004-2016