реклама на сайте
подробности

 
 
> Проблема с термодатчиком DS1820 (1-Wire), После процедуры чтения не работает поиск!
Praetor_Gix
сообщение Nov 27 2009, 08:18
Сообщение #1





Группа: Участник
Сообщений: 3
Регистрация: 15-04-07
Пользователь №: 27 047



Понадобилось мне подключить мне несколько термодатчиков DS1820 к отладочной плате Xilinx ML405 (Virtex4).
Был сделан проект в Xilinx Platform Studio, создана Pcore "1-wire контроллер".
Там же сделана Application, которая работает с данной Pcore.

Реализовал алгоритм поиска 1-Wire устройств по этому алгоритму:

http://www.maxim-ic.com/appnotes.cfm/an_pk/187
CODE
int Search_Device(unsigned char *Rom, char *LastDisc, char *LastDeviceFlag)
{
char last_zero = 0;
char id_bit_number, id_bit, cmp_id_bit, search_direction;


if (*LastDeviceFlag == 1)
{
*LastDisc = 0;
*LastDeviceFlag = 0;
return 0;
}
OneWireReset();
OneWireWrite(THERM_CMD_SEARCH_ROM);

for (id_bit_number=1; id_bit_number<=64; id_bit_number++)
{
id_bit = OneWireRead_Bit();
cmp_id_bit = OneWireRead_Bit();
if ((id_bit) && (cmp_id_bit))
{
*LastDisc = 0;
*LastDeviceFlag = 0;
OneWireReset();
return 0;
}
if ((!id_bit) && (!cmp_id_bit))
{
if (id_bit_number == *LastDisc) search_direction = 1;
else if (id_bit_number > *LastDisc) search_direction = 0;
else search_direction = Read_PositionBit_From_Rom(Rom, id_bit_number);
if (search_direction == 0) last_zero = id_bit_number;
}
else
{
search_direction = id_bit;
}
Write_PositionBit_Into_Rom(Rom, search_direction, id_bit_number);
OneWireWrite_Bit(search_direction);
}
*LastDisc = last_zero;
if (*LastDisc == 0) *LastDeviceFlag = 1;
OneWireReset();
return 1;
}

int Search_All_Devices(unsigned char *Roms, int maxnumber)
{
int result = 0;
int pointer = 0;
char LastDeviceFlag = 0;
char LastDisc = 0;
while (Search_Device(&Roms[pointer], &LastDisc, &LastDeviceFlag))
{
result++;
pointer += 8;
if (result >= maxnumber) return maxnumber;
}
return result;
}



Все работает замечательно.

Чтение информации с датчиков также работает.

CODE
void OneWire_ReadScratchpad_Rom (unsigned char* ReadBUF, unsigned char *Rom)
{
char i;
OneWireReset();
OneWireWrite(THERM_CMD_MATCH_ROM);
OneWire_TransferRom(Rom);
OneWireWrite(THERM_CMD_READ_SCRATCHPAD);
for (i=0; i<9; i++) *(ReadBUF+i) = OneWireRead();
OneWireReset();
}

void OneWire_TransferRom (unsigned char* ReadBUF) {
char i;
for (i=0; i<8; i++) OneWireWrite(*(ReadBUF+i));

}


Но!
Если после вызова функции Search_All_Devices вызвать функцию OneWire_ReadScratchpad_Rom, то Search_All_Devices перестает работать (выдает результат 0)
После чего функция чтения также перестает работать (выдает 9 бит 0xFF)

Если просто вызывать повторно несколько раз функцию Search_All_Devices, то она прекрасно работает (выдает правильно количество подключенных датчиков и их серийные номера).
Если после этого многократно вызывать функцию чтения - тоже прекрасно работает.
Но после этого вызов поиска рушит все.

Только перезагрузка ПЛИС восстанавливает все на свои места.

Элементарные операции 1-Wire (Ресет, чтение, запись бита, байта - работают превосходно, проверял осциллографом)

Подключено все правильно, иначе ничего бы не работало. Раньше сталкивался с той же проблемой на плате Spartan3, то есть дело скорее всего не в ПЛИС.

Может быть есть какой-то недокументированный баг в DS1820?

Дело в том, что я хочу написать GUI приложение, которое меряло бы температуру. Но если этот баг останется, то без перезагрузки ПЛИС оно будет работать корректно ровно 1 раз.

Буду очень благодарен за советы и помощь, дополнительную инфу (например код) кину, если надо
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 10:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01372 секунд с 7
ELECTRONIX ©2004-2016