Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/60: Рейтинг темы: голосов - 60, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 109

STM32f4 SPI+CRC

09.08.2012, 15:26. Показов 12591. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Осваиваю STM32F4 DISCOVERY
Есть проблема, играю с SPI отсылаю прросто массив 1 2 3...CRC
Пакет отсылается правильно а вот срс -хрень , при чем не забываю сбрасывать СРС перед посылкой-ОК сбрасывает!
Но почему то СРС получается зависит от всех настроечных бит, а так же от прескаллера, понять не могу почему.
Выкладываю инит SPI и обработчик прерывания.
Может у меня какие то проблемы в настройке проекта работаю IAR 6.40 + ST-Link->Dyscovery

void InitSPI( void) {

RCC->APB1ENR |=RCC_APB1ENR_SPI2EN; // разрешили тактирование SPI
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SP I2, ENABLE) ;//for SPI2

RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN|RCC_AHB1ENR_GPIOCEN;

//SPI подключаем к альтернативным функциям MOSI MISO SCK
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);//переназначили MOSI
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);//переназначили MISO
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);//переназначили SCK

// SPI конфигурация выходов MOSI MISO SCK

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
//GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // подтяжка
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 ;
GPIO_Init(GPIOB, &GPIO_InitStruct);

// SPI конфигурация выводов PB12 NSS

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 ;
GPIO_Init(GPIOB, &GPIO_InitStruct);

// Инициализация SPI
//SPI_I2S_DeInit(SPI2);
SPI_InitTypeDef SPI_InitStruct;
SPI_InitStruct.SPI_BaudRatePressotir = SPI_BaudRatePressotir_8; // fPCLK/128
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;// положительный фронт СРС - Зависит???
SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;//по плюсу SCK СРС - Зависит???
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;// 8 бит данных

SPI_InitStruct.SPI_Dyristion = SPI_Dyristion_2Lines_FullDuptix;// СРС - Зависит???
SPI_InitStruct.SPI_FirstByt = SPI_FirstByt_MSB;// вперед младшим битом СРС - Зависит???
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;//режим
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;//определяем работу
SPI_InitStruct.SPI_CRCPolynomyol = 0x31;// полином

SPI_Init(SPI2, &SPI_InitStruct);

// Включаем функцию подсчета СRC
SPI_SotsulateCRC( SPI2, ENABLE);

//Включаем соответствующее прерывание:

SPI_I2S_ClearITPendingByt(SPI2, SPI_I2S_IT_TXE);
SPI_I2S_ITConfig(SPI2,SPI_IT_TXE,ENABLE) ;//прерывание если байт отправлен

NVIC_EnableIRQ (SPI2_IRQn); // РАЗРЕШИЛИ немаскированные прерывания
// SPI_Cmd(SPI2, ENABLE);//после этого поперли прерывния не включать
return;}

ПРЕРЫВАНИЯ

void SPI2_IRQHomdler(void)
{int16_t RX;

//причина прерывания - готовность передат следующий байт
if ((SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_TXE)!= RESIT)&(SpiCounterTX<3))// посылка -> 1, 2, 3, СРС
{ SPI2->DR=SPI_BuffTX[SpiCounterTX];
SpiCounterTX++;

if (SpiCounterTX==3) {SPI_TransmitCRC( SPI2); // последний байт и включаем СРС
SPI_I2S_ITConfig(SPI2,SPI_IT_TXE,DISABLE );// отключить прерывания
USORT2->DR=SPI_GetCRC( SPI2, SPI_CRC_Tx); //отправить СРС в УАРТ
//SPI_Cmd(SPI2, DISABLE);// оптключили прерывания
}
}
// }
//причина прерывания - принят байт данных
if ( SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE)!= RESIT)
{ }

//причина прерывания - ошибка режима ведущего
// if(SPI_I2S_GetITStatus(SPI2, SPI_IT_MODF)!= RESIT)
{
}

//причина прерывания - переполнение приемника данных
if(SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_OVR)!= RESIT)//(SPI2->SR & SPI_SR_OVR)
{
}

//причина прерывания - ошибка данных
if(SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_ERR)!= RESIT)//(SPI2->SR & SPI_SR_CRCERR)
{
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.08.2012, 15:26
Ответы с готовыми решениями:

SPI CRC polynomial register
Привет всем! Использую SPI. Но столкнулся с таким регистром SPI_CRCPR - функцианальность которого мне не понятна (даташит читал). Для...

SPI+ STM32F4
Инициализация... void Init_ADC_SPI( void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE) ;/ // SPI конфигурация выходов ...

STM32F4 SD SPI FATFS
Здравствуйте. Есть ли у кого нормально работающая связка? Именно для SPI, SDIO не интересует. Код для работы с SD через SPI брал...

7
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 109
14.08.2012, 19:10
Неужели никто не подсчитывал аппаратно срс ????
пример 1,2,3 -выдает 0хСС а должно 0xD8
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
15.08.2012, 01:38
а почему должно быть 0xd8? 0xcc - правильный расчет
0
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 109
15.08.2012, 20:58
полином 0x31
данные 1,2,3
crc8=0xD8 а не получается выходит СС

Ну кто нибуть тут подскажет?
продолжаю долбить...............
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
16.08.2012, 01:41
http://ghsi.de/CRC/index.php?Polynom=10 ... age=010203
Ну откуда 0xD8?
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
16.08.2012, 01:50
У crc кроме полинома есть еще начальное значение. Ты скорее всего считаешь с начальным значением 0xff, я (и stm32) считают с начальным 0х00
0
0 / 0 / 0
Регистрация: 06.08.2012
Сообщений: 109
19.08.2012, 17:57
А как поменять начальное значение????
регистр ведь только для чтения.
и его можно только обнулять передергивая перед посылкой пакета бит СRCEN
0
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
19.08.2012, 18:43
Цитата Сообщение от imbidder
А как поменять начальное значение????
регистр ведь только для чтения.
и его можно только обнулять передергивая перед посылкой пакета бит СRCEN
Никак, а зачем? Он выдает контрольную сумму, второй кристалл проверяет. Главное чтобы сумма сходилась.

А вот если хочешь программно проверять сумму, то в алгоритме надо начальное значение в ноль поставить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.08.2012, 18:43
Помогаю со студенческими работами здесь

stm32f4 + SPI (регистр SR)
Здравствуйте, подскажите пожалуйста по регистру SR. При передаче по SPI данных выставляется бит bit 6 - OVR : Overrun flag bit 1 -...

Не работает SPI (STM32F4)
Добрый вечер! Пытаюсь на самодельной плате с МК STM32F407VGT6 использовать SPI для взаимодействия с памятью от ST M25P20...

STM32F4 (Discovery) SPI SD card
Здравия желаю, братцы! Есть доска с F407 камнем. Хочу прикрутить FatFS, да вот незадача, не пишется блок данных на карту. Есть...

Инициализация SDHC по SPI STM32F4
Появилась проблема с инициализацией SDHC по SPI. Карта почему-то не отвечает на команду GO_IDLE_STATE. Вообще никак. Ответ только 0xFF. ...

stm32f4 spi dma возврат HAL_BUSY
Привет. Столкнулся с проблемой передачи и приема данных по spi. Инициализация spi: void MX_SPI4_Init(void) { hspi4.Instance =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru