8-канальный логический анализатор Saleae Logic.

Posted by Reason89 | Posted in ,

    В Китае был приобретен 8 канальный Логический анализатор в качестве настольного инструмента для отслеживания сигналов. Шикарная вещь, для людей, который часто работают с цифровыми протоколами передачи данных.
    Когда заказывал даже не представлял о возможностях, которые он в себе содержит.
    Начинка стандартная, тот же контроллер CY7C68012A, что и стоит во всех подобных анализаторах. Буфер на микросхеме LVC245A и память ATMLH53602.
    Поддерживает огромное количество цифровых протоколов, принимает обрабатывает и расшифровывает то, что передается по линии. Вполне наглядно можно видеть, какая посылка на  передается по линии, когда у нас что то не работает. Вплоть до скорости обмена.
    Вроде как у оригинального анализатора, который скопировали в поднебесной на плате еще установлена всевозможная защита по каналам и.т.д. Но ценник у него чуть ли не в 10 раз больше.  А возможности одинаковые.
    В комплекте сам анализатор, USB шнурок для питания и шлейф для подключения к плате.  Вскрывается легко, пайка хорошая, плата чистая(никаких следов флюса не обнаружено). Но плата в корпусе сидит не жестко, поэтому желательно в нескольких точках зафиксировать ее герметиком.
    Работать должен с такими программами как Saleae Logic и USBee Suite, но я пробовал только с первой, до второй руки так и не дошли, так как и с первой меня все более чем устроило. При подключении анализатора к ПК, он сам устанавливает все необходимые драйвера.
    В программе Saleae Logic все просто, выставляет время замера, у каждого канала выставляем назначение вывода, который мы к нему подцепили SCL, SDA, TX, RX и.т.д. Если не назначать, то он все так же прекрасно покажет, но уже не будет наглядной расшифровки передаваемых посылок. Выставлять по какому фронту срабатывать ну и много много других настроек. Частота дискретизации 24МГц, что в 99% случаев за глаза хватает. Ну и нажимаем Start.
Купить 8 Канальный логический анализатор Saleae Logic

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
 
}