Xmega & MAX6633 (TWI)

Posted by Reason89 | Posted in , , ,

    MAX6633 - интегральный датчик температуры с I2C интерфейсом, либо TWI кому как удобно.
    Микросхема простая до невозможности, на запрос температуры присылает  2 байта информации. Сдвигаем на три бита вправо, получаем 12 битное значение температуры плюс 1 знак(+/-).
    1 бит это 0,0625 градуса. Мне точность важна не так сильно, потому я просто полученное значение делил на 16 и получал уже температуру в привычных градусах.
    Теперь относительно TWI  в Xmega, на первый взгляд кажется дремучим лесом. Но на деле, все не так сложно. Для начала лучше всего изучить теорию TWI(I2C), если усвоить алгоритм работы протокола, то вопросов в разы будет меньше.
     Я надолго завис над одной проблемой, когда при чтении старшего байта температуры получал NAK в конце посылки. При более детальном изучении теории, я понял, что оказывается при чтении я формирую ответ, а не ведомой устройство.
    Проблему удалось быстро решить благодаря Логическому анализатору. Подпаялся к SCL и к SDA, поймал посылку. Программа, которая шла в комплекте сразу расшифровала посылку и я увидел в чем была моя проблема. Потому если у вас еще нет такого помощника, обязательно заказывайте у проверенного продавца.
    Ну и собственно исходный код инициализации и приема передачи. Делал без прерываний, так как в них не было необходимости:
// Инициализация TWI
void TWIC_init(void)
{
 TWIC.CTRL = 0;
 TWIC.MASTER.BAUD = 0x23;     // При 8 Мгц, на 100кГц = 35(0x23)
 TWIC.MASTER.CTRLA = TWI_MASTER_ENABLE_bm;
 TWIC.MASTER.CTRLB = 0;
 TWIC.MASTER.CTRLC = 0;
 TWIC.MASTER.STATUS = TWI_MASTER_RIF_bm | TWI_MASTER_WIF_bm | TWI_MASTER_ARBLOST_bm | TWI_MASTER_BUSERR_bm | TWI_MASTER_BUSSTATE0_bm;
}

// Отправка данных по TWI
void TWIC_Transiver()
{
 TWIC.MASTER.ADDR = MAX_ADDR | MAX_WRITE ;   // Отправляю адрес с командой на запись 0b10000000 
 while (!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm));
    
 TWIC.MASTER.DATA = MAX_Command;     // Отправляю команду 0b00000000
 while(!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm));
 
 TWIC.MASTER.ADDR = MAX_ADDR | MAX_READ ;   // Еще раз отправляю адрес с командой на чтение 0b10000001
 
 while(!(TWIC.MASTER.STATUS & TWI_MASTER_RIF_bm));  // Считываю старший байт температуры
 MSB_temp = TWIC.MASTER.DATA;
 
 TWIC.MASTER.CTRLC = 0x02;     // Выставляю ACK на линии
 
 while(!(TWIC.MASTER.STATUS & TWI_MASTER_RIF_bm));  // Считываю младший байт температуры
 LSB_temp = TWIC.MASTER.DATA;
 
 TWIC.MASTER.CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc;// Отправляю стоп бит
 TWIC.MASTER.CTRLC = 0;      // Обнуляю регистр NAC-ACK
 
}




Comments (0)

Отправить комментарий