С SPI происходит что-то странное : Биты RDRF, TDRE по которым можно судить об окончании передачи иногда выставляются, а иногда нет
Код в kiel:
*AT91C_SPI_CR=AT91C_SPI_SPIEN; //инициализация *AT91C_SPI_MR=AT91C_SPI_MSTR; AT91C_BASE_SPI->SPI_CSR[0]=0xC02 ; ......................
transmit_data=(0<<6)|(0x6<<1)|(0<<0); //передача-приём *AT91C_SPI_TDR=transmit_data; while(!(*AT91C_SPI_SR & AT91C_SPI_RDRF) {} // ждём пока закончится передача, на этой строчке зависает. receive_data=*AT91C_SPI_RDR;
Смотрю под отладкой. Зависает каждый раз в разный момент. Причём проблема появилась после того как я включил WDT и раскидал по коду команду его сброса.
У меня много прерываний, предположил что программа уходит в прерывание и пропускает момент когда в регистре выставилась 1, но одновременно успевает её сбросить. Отключил половину-ничего не изменилось. Да и весь остальной код(USB, UART, чтение портов по прерываниям ) работает безглючно.
А у этой проблемы с SPI прямая зависимость от включенного WDT и его периодического сброса .
Я правильно понимаю, что выставление битов в регистре SPI_SR ни как не зависит от сотояния линии MISO , потому что SPI просто считает свои же такты ? Кто что посоветует ?
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|