Аппартаный TWI настроен без прерываний.
Код посылки байта:
int TWI_Write(unsigned char address,//FM24V10_ADDRESS unsigned int iaddress, // Адрес по которому записать unsigned int isize, // Размер внутреннего адреса ведомого устрйоства AT91C_TWI_IADRSZ_2_BYTE unsigned char *pData, // Указатель на данные, которые нада записать unsigned int num) // Количество байт для записи { unsigned int status, err=0, Counter=0; // Set internal address bytes AT91C_BASE_TWI->TWI_IADR = 0; AT91C_BASE_TWI->TWI_IADR = iaddress;
// Set slave address and number of internal address bytes AT91C_BASE_TWI->TWI_MMR = 0; AT91C_BASE_TWI->TWI_MMR = isize; AT91C_BASE_TWI->TWI_MMR = (isize | (address << 16)) & ~AT91C_TWI_MREAD; AT91C_BASE_TWI->TWI_THR=*pData; AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START | AT91C_TWI_STOP | AT91C_TWI_MSEN; status = AT91C_BASE_TWI->TWI_SR; while (!(status & AT91C_TWI_TXRDY)) { status = AT91C_BASE_TWI->TWI_SR; //************************************ if ((status & AT91C_TWI_NACK) == AT91C_TWI_NACK) { err++; } } .......
Происходят 2 вещи: 1. Цикл while почему-то виснит. Зацикливается. 2. Если поставить небольшую задержку в место отмеченное //****************** то вроде проходит нормально, но имеются err, хотя запись происходит ВЕРНО!
Что не верно???
|