А вот у меня другая проблема - нижеприведенный кусок работает из main - а, но не работает в прерывании от таймера. Понимаю, что не в тему, но все-же почему флаг AT91C_SPI_TXEMPTY не сбрасывается если я его проверяю в теле обработчика. Такая же ерунда с флагом результатом от АЦП и TWI ????
А вот это работает:
u8 at45_check(u8 CS_num) { SPI_tr8(0x84, CS_num, 0); BUFFER 0 write SPI_tr8(0, CS_num, 0); SPI_tr8(0, CS_num, 0); SPI_tr8(0, CS_num, 0); SPI_tr8(0xAA, CS_num, 1); SPI_tr8(0xD4, CS_num, 0); SPI_tr8(0, CS_num, 0); SPI_tr8(0, CS_num, 0); SPI_tr8(0, CS_num, 0); SPI_tr8(0, CS_num, 0); u8 read_test = SPI_tr8(0,CS_num,1); if(read_test == 0xAA)return 1; else return 0; }//at45_check
u8 SPI_tr8(u8 byte, u8 cs_num, u8 last) { while (!((AT91C_BASE_SPI->SPI_SR) & AT91C_SPI_TXEMPTY)); //AT91F_SPI_CfgPCS(AT91C_BASE_SPI, 0x0E); AT91F_SPI_PutChar(AT91C_BASE_SPI, (u16)byte, cs_num, last); u8 returned = (u8)AT91F_SPI_GetChar(AT91C_BASE_SPI); return returned; }
Модифицированный AT91F_SPI_PutChar:
__inline void AT91F_SPI_PutChar ( AT91PS_SPI pSPI, unsigned int character, unsigned char cs_number, unsigned char last) { unsigned int value_for_cs; value_for_cs = (~(1 << cs_number)) & 0xF; pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16) | (last << 24); }
|