|
1-wire+микроконтроллер, Работа с DS2431(1-wire) |
|
|
|
Jun 9 2011, 10:36
|
Частый гость
 
Группа: Участник
Сообщений: 76
Регистрация: 1-02-11
Из: Томск
Пользователь №: 62 613

|
Здравствуйте, есть проблема не могу связать DS2431 и микроконтроллер. Моделирую в Протеусе работу микроконтроллера с DS2431. DS2431 отвечает, что оно присутствует, потом хочу записать данные видно, что данные идут а в ответ ничего подскажите как быть. код программы привел и схема. CODE #define OW_RESET() DDRD|=(1<<DDD0);\ PORTD&=~(1<<PD0);\ DELAY_US(500)
#define OW_SEND_ONE() DDRD|=(1<<DDD0);\ PORTD&=~(1<<PD0);\ DELAY_US(10);\ DDRD&=~(1<<DDD0);\ PORTD|=(1<<PD0);\ DELAY_US(10)
#define OW_SEND_ZERO() DDRD|=(1<<DDD0);\ PORTD&=~(1<<PD0);\ DELAY_US(100);\ DDRD&=~(1<<DDD0);\ PORTD|=(1<<PD0);\ DELAY_US(10)
typedef unsigned char BYTE;
int main(void) { //DDRD|=(1<<DDD1);
BYTE DevDetect; OW_RESET(); DDRD&=~(1<<DDD0); PORTD|=(1<<PD0); DELAY_US(65); if((PIND&(1<<PIND0))==0) { DevDetect=1; } else DevDetect=0; DELAY_US(415); //OW_SendByte(0x55); //OW_SendByte(0xF0); OW_SendByte(0x0F); OW_SendByte(0x20); OW_SendByte(0x00); OW_SendByte(0x8C); return DevDetect; }
void OW_SendByte(BYTE val) { for(int i=0; i<8; ++i) { if(val&(1<<i)) { OW_SEND_ONE(); } else { OW_SEND_ZERO(); } } }
Сообщение отредактировал IgorKossak - Jun 9 2011, 11:23
Причина редактирования: [codebox] !!!
Эскизы прикрепленных изображений
Прикрепленные файлы
23423.bmp ( 87.56 килобайт )
Кол-во скачиваний: 7
|
|
|
|
|
 |
Ответов
|
Jun 9 2011, 12:56
|
Частый гость
 
Группа: Участник
Сообщений: 76
Регистрация: 1-02-11
Из: Томск
Пользователь №: 62 613

|
Цитата(Палыч @ Jun 9 2011, 15:36)  Спасибо за ответ. Тайминги все выдерживаются, которые приведены на стр 2 и 3(проверял на временной диаграмме). А пример который, я делал на стр 21 "Write Scratchpad" (там несколько примеров), в ответ хотел видеть "CRC-16" и "FF Loop", на временной диаграмме я их не увидел. У самого MAXIM есть примеры записи данных и считывания, пробовал не получается. Также вы подсказали хорошую идею которая на странице 22, попробую.
Сообщение отредактировал IgorKossak - Jun 9 2011, 19:02
Причина редактирования: Избыточное цитирование
|
|
|
|
|
Jun 9 2011, 13:25
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(ks007 @ Jun 9 2011, 16:56)  Тайминги все выдерживаются, которые приведены на стр 2 и 3(проверял на временной диаграмме). Позволю себе усомниться: не выдерживается Tslot при передаче единицы... Цитата(ks007 @ Jun 9 2011, 16:56)  ...на временной диаграмме я их не увидел. Как же вы их увидете, если: 1. Выбросили ”Skip ROM” 2. Не выдали восемь(!) байт данных 3. Не произвели чтение. При чтении мастер (МК в этом случае - мастер) не "сидит сложа руки". Грубо говоря он формирует "Write-one time slot" (формирует короткий импульс, а затем "отпускает" линию: переводит на чтение с подтяжкой к питанию), а DS2431 "задерживает" низкий уровень на линии, если читается с неё ноль, или - "отпускает", если читается с неё единица. Мастер определяет это по состоянию линии в "Master sampling window".
|
|
|
|
|
Jun 9 2011, 14:12
|
Частый гость
 
Группа: Участник
Сообщений: 76
Регистрация: 1-02-11
Из: Томск
Пользователь №: 62 613

|
Цитата(Палыч @ Jun 9 2011, 17:25)  Восемь байт данных я отослал, понимаю код тяжко читается, но в программе это "OW_SendByte(0x8C);" а c Tslot точно не выдержал я думал, что Trec и все можно дальше кидать данные. как я понял например: отослал 1 байт надо выждать Tslot и засылать след байт. попробую все исправить, о результатах напишу.
Сообщение отредактировал IgorKossak - Jun 9 2011, 19:02
Причина редактирования: Избыточное цитирование
|
|
|
|
|
Jun 9 2011, 14:48
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(ks007 @ Jun 9 2011, 18:12)  Восемь байт данных я отослал, понимаю код тяжко читается, но в программе это "OW_SendByte(0x8C);" Не-а... Функция OW_SendByte выводит один байт (или восемь бит). Цитата(ks007 @ Jun 9 2011, 18:12)  как я понял например: отослал 1 байт надо выждать Tslot и засылать след байт. У Вас мешанина между байтами и битами... При выдаче бита устанавливается низкий уровень на время Tw1L (или Tw0L, в зависимости от значения выводимого бита), затем устанавливается высокий уровень и ждём Tslot - Tw1L (или Tslot - Tw0L). Т.е. время между началом передачи двух соседних битов (или время передачи одного бита с любым значением) должно быть равным Tslot.
|
|
|
|
Сообщений в этой теме
ks007 1-wire+микроконтроллер Jun 9 2011, 10:36     ks007 Цитата(Палыч @ Jun 9 2011, 17:48) У Вас м... Jun 10 2011, 10:52 ks007 Тайминги все выдержал(рис3), послал 8 байт данных,... Jun 11 2011, 09:59 Палыч Длина CRC составляет два байта. В Вашей программе ... Jun 11 2011, 13:16 xemul Цитата(ks007 @ Jun 11 2011, 13:59) Что не... Jun 11 2011, 16:52 ks007 Спасибо огромное, все заработало. Это мой первый о... Jun 13 2011, 05:03
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|