Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103 SPI2
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Григорий Ревзин
Ребят, такое дело.
Инициализирую 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;
}
AHTOXA
Всё правильно вроде... В плане танцев с бубном попробуйте сделать вот что:
1. Уберите SPI_CR2_SSOE, оно всё равно не работает.
2. Замените SET_BIT(SPI2->CR2,... на SPI2->CR2 = ...
3. То же самое для SPI2->CR1.
4. Ну и в инициализации портов GPIO посмотрите, не надо ли где-нибудь сначала сделать CLEAR_BIT, перед SET_BIT. Чтобы не зависеть от текущего состояния.
Григорий Ревзин
Точно, спасибо огромное 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'ов, теперь записывается то, что надо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.