Здравствуйте!
К Xmega32D4 подключена ИМС с UID ds2411. 1-wire реализовывала сама в avrstudio6. Reset проходит, ответ на него приходит. После команды Read ROM (0x33) в ответ приходит стабильно одна и та же последовательность байт, но почему-то последние два байта нулевые (хотя самый последний байт должен быть CRC). Первый байт считывается правильно 0x01. Из чего сделала вывод, что тайминги все соблюдаются, да и осциллограф об этом же говорит. Пробовала на двух разных платах (соответственно с двумя разными ИМС ds2411). Результат одинаковый. В чем может быть проблема?
Тактовый сигнал таймера 16 МГц.
Просмотрела 20 страниц форума по результату поиска по 1-wire. Ничего похожего на мою ситуацию не нашла, поэтому и создаю очередную тему.
CODE
#define trstl 480
#define tpdh 70
#define tpdl 250
#define tslot 35
void init_timer0(void)
{
// enable timer and its clock system
tc_enable(&TCC0);
//задаем режим работы таймера: обычный
tc_set_wgm(&TCC0, TC_WG_NORMAL);
}
void timer_delay_us(unsigned int us_count)
{
uint16_t us=0;
us=us_count*16;
// устанавливаем top
tc_write_period(&TCC0, us);
// устанавливаем источник тактирования и начинаем считать!
tc_write_clock_source(&TCC0, TC_CLKSEL_DIV1_gc);
while(!(tc_is_overflow(&TCC0)));
tc_clear_overflow(&TCC0);
// stop timer
tc_write_clock_source(&TCC0, TC_CLKSEL_OFF_gc);
tc_write_count(&TCC0,0);
}
unsigned char send_reset(void)
{
unsigned int delay_count=0;
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_OUTPUT);
ioport_set_pin_level(PORT_UID, 0);
timer_delay_us(trstl);
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_INPUT);
// ждем ответа ds2411 (ждем нуля на линии)
// либо выхода по тайм-ауту
while((ioport_get_pin_level(PORT_UID))&&(delay_count<tpdh))
{
timer_delay_us(1);
delay_count++;
}
if (delay_count==tpdh) return 0;
delay_count=0;
// ждем пока ds2411 держит ответ (ждем 1 на линии)
while((!(ioport_get_pin_level(PORT_UID)))&&(delay_count<tpdl))
{
timer_delay_us(1);
delay_count++;
}
if (delay_count==tpdl) return 0;
return 1;
}
void write_one(void)
{
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_OUTPUT);
ioport_set_pin_level(PORT_UID, 0);
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_INPUT);
timer_delay_us(tslot);
}
void write_zero(void)
{
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_OUTPUT);
ioport_set_pin_level(PORT_UID, 0);
timer_delay_us(tslot);
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_INPUT);
}
void send_ROM_read(void)
{
// посылаем код команды 0x33 младшим битом вперед
write_one();
write_one();
write_zero();
write_zero();
write_one();
write_one();
write_zero();
write_zero();
}
unsigned char read_byte(void)
{
unsigned char temp=0,i;
for(i=0;i<7;i++)
{
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_OUTPUT);
ioport_set_pin_level(PORT_UID, 0);
ioport_set_pin_dir(PORT_UID,IOPORT_DIR_INPUT);
LED_GREEN_ON();
if (ioport_get_pin_level(PORT_UID))
{
temp|=0x80;
}
LED_GREEN_OFF();
temp>>=1;
timer_delay_us(tslot);
// while(!(ioport_get_pin_level(PORT_UID)));
// usart_serial_putchar(USART_SERIAL, temp);
}
return temp;
}
void read_UID(unsigned char *uid)
{
unsigned char i;
while (!send_reset());
timer_delay_us(tpdl);
send_ROM_read();
timer_delay_us(tslot);
for (i=0;i<8;i++)
{
LED_RED_ON();
// usart_serial_putchar(USART_SERIAL, i);
*uid=read_byte();
// usart_serial_putchar(USART_SERIAL, *uid);
LED_RED_OFF();
uid++;
}
}