ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
7 июня
1523065 Топик полностью
mse homjak (Вчера, 18:30, просмотров: 66) ответил IBAH на Разговор о том, что флаг RXNE выставляется, по факту не когда происходит завершение приема, а на несколько десятков тактов проца позже (в моем случае гдето 500нС). В результате стоишь тупо ждешь RXNE!=0, как дебил. С флагом BSY та же история.
RXNE выставляется после передачи байта. Полюбому, чисто, чтобы вы не забыли вычитать данные(на самом деле, хуй его знает, зачем этот флаг). Смотрите первые два сообщения по сцылке про это. И пофиг, передаётся 8 или 16 бит. Это косяг, ессно. Флаг должэн взводиться после завершения базовой транзакции, т.к. при передаче одновременно идёт и приём. Т.е. сигнала BUSY или TXE достаточно. Хотя TXE тожэ нах не упёрся, они оба-три дублируют друг друга. Нижэ код работы с АЦП. 

https://caxapa.ru/1318658.html

void TIM4_IRQHandler(void)	//два АЦП стоят daisy chain, таймер на 4мкс
{
	TIM4->INTFR&=~TIM_IT_Update;
	ADCswapChannel=0;         //сигнализируем для прерывания СПИ, что пойдут данные с первого АЦП и начинаем приём, загрузив в DATAR "0"
	SPI2->DATAR=(uint16_t)0;   //start SPI16
}



void SPI2_IRQHandler(void) //по TXEIE { if(ADCswapChannel==0) //смотрим, какое АЦП интеруптнуло { ADCswapChannel=(int)-1; //если первое, кладём данные из буфера в норку и запускаем передачу данных со второго ADCdataHighSense=SPI2->DATAR; SPI2->DATAR=(uint16_t)0; //start SPI16 } else { //если второе, то кладём данные в норку и перезапускаем преобразование CNV GPIOB->BSHR=bit12ResetBSHR; //CNV=0 ADCdataLowSense=SPI2->DATAR; ADCdataHere=-1; //сообщаем фону, что, "таки, да" } GPIOB->BSHR=bit12SetBSHR; //CNV=1 }