[UPD]Так и делаю. При попытке рулить активностью SPI посредством бита SSI прерывания прикидываются шлангом. Или надо после выставления бита ещё и SPE перевыставить? Можно ли при управлении через SPE гарантировать целостность данных (SPIx->DR) после
сброса бита?
Ещё интересный момент: в обработчик прерывания периодически попадаю при SPIx->SR равном 0x80 или 0x00. То есть нет ошибок, событий приёма или передачи, а вызов обработчика есть. Активность флага занятости?...
UPD: Примитивный трассер и его вывод, ещё сам не анализировал.
void SPI1_IRQHandler(void)
{
GPIO_WriteBit( GPIOA, GPIO_Pin_4, Bit_SET);
static int xcall = 0;
// xcall++;
arr[xcall++] = __LINE__;
arr[xcall++] = ADC_SPIIF->SR;
if ( byte_count < 3) {
arr[xcall++] = __LINE__;
// Receive something //
if (SPI_I2S_GetITStatus(ADC_SPIIF, SPI_I2S_IT_RXNE) == SET)
{
arr[xcall++] = __LINE__;
SPI_I2S_ReceiveData( ADC_SPIIF);
}
// Transmiter ready //
if (SPI_I2S_GetITStatus(SPI1, SPI_I2S_IT_TXE) == SET)
{
arr[xcall++] = __LINE__;
byte_count++;
SPI_I2S_SendData( ADC_SPIIF, 0xF2);
}
msg = "P\r\n";
} else {
arr[xcall++] = __LINE__;
// Receive something //
if (SPI_I2S_GetITStatus(ADC_SPIIF, SPI_I2S_IT_RXNE) == SET)
{
arr[xcall++] = __LINE__;
SPI_I2S_ReceiveData( ADC_SPIIF);
adc_Release();
}
// Transmiter ready //
if (SPI_I2S_GetITStatus(SPI1, SPI_I2S_IT_TXE) == SET)
{
arr[xcall++] = __LINE__;
byte_count++;
//SPI_I2S_SendData( ADC_SPIIF, 0xA3);
}
msg = "O\r\n";
if (xcall >= 100) xcall = 0;
}
// Error flag//
if (SPI_I2S_GetITStatus( ADC_SPIIF, SPI_I2S_IT_ERR) == SET)
{
arr[xcall++] = __LINE__;
msg = "E\r\n";
}
GPIO_WriteBit( GPIOA, GPIO_Pin_4, Bit_RESET);
}
printf("t:%d\r\n", SysTime);
for ( int i=0; i<=100; i++) {
printf("%4u\t", arr[i]);
arr[i] = 0;
}
// ........................
if ( msg != NULL) {
printf("M:%s\r\n", msg);
msg = NULL;
}
t:30
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 M:P
t:1030
198 128 202 213 198 128 202 198 129 202 206 213 198 128 202 198 129 202 206 213 198 128 219 198 129 219 223 230 198 130 219 230 198 3 219 223 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 M:P
t:2030
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 198 128 202 213 198 128 202 198 129 202 206 213 198 128 202 198 129 202 206 213 198 128 219 198 129 219 223 230 198 130 219 230 198 3 219 223 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 M:P
t:3030
198 130 219 230 198 3 219 223 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 198 128 202 213 198 128 202 198 129 202 206 213 198 128 202 198 129 202 206 213 198 128 219 198 129 219 223 M:P