Прерывание
Код:
void SPI2_IRQHandler( void ) {
if ( SPI2->SR & SPI_SR_RXNE ) {
SPI_RBuffer[SPI_RPos++] = SPI2->DR;
if ( ++SPI_RPos == SPI_RCount )
SPI_RPos = 0;
if ( SPI_SCount ) {
if ( ( SPI_SCount & 0x7 ) == 0 ) {
GPIOB->ODR |= GPIO_ODR_ODR12;
GPIOB->ODR &= ~GPIO_ODR_ODR12;
}
SPI2->DR = SPI_SBuffer[SPI_SPos++];
SPI_SCount--;
} else {
GPIOB->ODR |= GPIO_ODR_ODR12;
SPI2->CR2 &= ~SPI_CR2_RXNEIE;
}
}
}
формирование посылки
Код:
uint32_t temp;
while ( SPI_SCount ) {}
SPI2->CR2 &= ~SPI_CR2_RXNEIE;
GPIOB->ODR &= ~GPIO_ODR_ODR12;
for ( temp = 0; temp < 8; temp++ ) {
SPI_SBuffer[temp * 8 + 0] = temp + 1;
SPI_SBuffer[temp * 8 + 1] = DATA[ temp + 24 ];
SPI_SBuffer[temp * 8 + 2] = temp + 1;
SPI_SBuffer[temp * 8 + 3] = DATA[ temp + 16 ];
SPI_SBuffer[temp * 8 + 4] = temp + 1;
SPI_SBuffer[temp * 8 + 5] = DATA[ temp + 8 ];
SPI_SBuffer[temp * 8 + 6] = temp + 1;
SPI_SBuffer[temp * 8 + 7] = DATA[ temp + 0 ];
}
SPI_SPos = 1;
SPI_SCount = 63;
SPI2->DR = SPI_SBuffer[0];
SPI2->CR2 |= SPI_CR2_RXNEIE;
GPIO_ODR_ODR12 - строб
4 последовательно включенных макса