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);//выкл прерывания
}
}