ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
346981
Luba (13.08.2012 22:23 - 22:29, просмотров: 1760)
STM32F407 discovery +SPI +CRC. Проблема с срс, неправильно считает.. и зависит от настроек SPI,в частности бита управления LSM, MSB/ мне необходимо в конце пакета кидать срс со стандартным полиномом 0х31 , а контрольная сумма считается неправильно..плиззз хелп.. А так же почему после инициализации после SPI_Cmd(SPI2, ENABLE) сразу прут прерывания Вот исходники инициализации-программы прерывания...поможите void InitSPI2( void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE) ;//for SPI2 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // SPI конфигурация выходов PB15,PB14 ,PB13 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // подтяжкаgpiob.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 ; GPIO_Init(GPIOB, &GPIO_InitStructure); // SPI конфигурация выводов PB12 NSS GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 ; GPIO_Init(GPIOB, &GPIO_InitStructure); //SPI подключаем к альтернативным функциям AF5; GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);//переназначили MOSI GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); // Инициализация SPI SPI_I2S_DeInit(SPI2); SPI_InitTypeDef SPI_InitStructure; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // fPCLK/128 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;// положительный фронт SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//по плюсу SCK SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;// 8 бит данных SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;// режим - 2 линии - полный дуплекс //вот сдесь и покувыркаемся SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;// вперед младшим битом SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//режим SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//определяем работу SPI_InitStructure.SPI_CRCPolynomial = 0x31;// полином SPI_Init(SPI2, &SPI_InitStructure); SPI_SSOutputCmd(SPI2, ENABLE); //SPI1->CR1|=SPI_CR1_BIDIOE;//|SPI_CR1_BIDIMODE; // Включаем функцию подсчета СRC SPI_CalculateCRC( SPI2, ENABLE); //Включаем соответствующее прерывание: SPI_I2S_ClearITPendingBit(SPI2, SPI_I2S_IT_TXE); SPI_I2S_ITConfig(SPI2,SPI_IT_TXE,ENABLE);//прерывание если байт отправлен NVIC_EnableIRQ (SPI2_IRQn); // РАЗРЕШИЛИ немаскированные прерывания //SPI_Cmd(SPI2, ENABLE);//после этого поперли прерывния не включать return; }//---------------------------------------- А это - отправляю пакет вида 1.2.3.4... по прерыванию int main( void) { int i; for (i=0; i<512; i++) // создаем буфер который будем передавать 1....512 SPI_BuffTX[i]=i+1; InitGPIO(); InitSPI2(); InitSPI1(); InitUART(); InitDMA_FIFO(); while( 1) { if (GPIOA->IDR & GPIO_IDR_IDR_0) { // если кнопка нажата, 1на пине // SET_BIT(GPIOD->BSRRL, LED_GREEN);//5 тактов GPIOD->ODR ^= LED_GREEN ; //3 такта Delay( 1000000); GPIOD->ODR ^= LED_ORANGE ; Delay( 1000000); GPIOD->ODR ^= LED_RED ; Delay( 1000000); GPIOD->ODR ^= LED_BLUE; Delay( 1000000); USART2->DR=SPI_GetCRC( SPI2, SPI_CRC_Tx); //отправить СРС в УАРТ SPI2->CR1 ^=SPI_CR1_CRCEN; //0 SPI2->CR1 ^=SPI_CR1_CRCEN; //1 обнуляем СРС SpiCounterTX=0; обнулили счетчик буфера SPI_I2S_ITConfig(SPI2,SPI_IT_TXE,ENABLE); SPI_Cmd(SPI2, ENABLE); i++; } else GPIOD->ODR=0 ; // погасить все светодиоды } } прерывание void SPI2_IRQHandler(void) { uint16_t RX; if ((SPI2->SR = SPI_I2S_IT_TXE)&(SpiCounterTX<511))// гораздо короче { SPI2->DR=SPI_BuffTX[SpiCounterTX]; //оправили данные SpiCounterTX++; if (SpiCounterTX==511) {SPI2->CR1 |= SPI_CR1_CRCNEXT;//последний байт- разрешаем передачу срс SPI_I2S_ITConfig(SPI2,SPI_IT_TXE,DISABLE);//выкл прерывания } }