Вот старые исходники
Функция передачи данных:
Код:
/*****************************************************************************
* tm_send
*
* Отправка байта.
*/
static void tm_send( unsigned char byte )
{
static unsigned char i,b;
b=byte;
for( i = 0; i < 8; i++ )
{
unsigned char pulldown_time, recovery_time;
if( b & 1 )
{
/* write-one time slot */
pulldown_time = 10;
recovery_time = 80;
}
else
{
/* write-zero time slot */
pulldown_time = 70;
recovery_time = 20;
}
dint();
TM_TX_PULLDOWN();
tm_delay( pulldown_time );
TM_TX_RELEASE();
eint();
tm_delay( recovery_time );
b >>= 1;
}
}
Функция приема данных:
Код:
/*****************************************************************************
* tm_read
*
* Приём байта.
*/
static unsigned char tm_read()
{
static unsigned char i, ret = 0;
for( i = 0; i < 8; i++ )
{
unsigned char in;
dint();
TM_TX_PULLDOWN();
tm_delay( 5 );
TM_TX_RELEASE();
tm_delay( 5 );
in = TM_RX_IN;
eint();
ret >>= 1;
if( in & TM_RX_PIN )
ret |= BIT7;
/* release & recovery */
tm_delay( 200);
}
return ret;
}
Подсчёт crc:
Код:
/*****************************************************************************
* new_crc8
*
* Вычисление нового значения CRC8.
*/
static unsigned char new_crc8( unsigned char crc8, unsigned char byte )
{
unsigned char i;
for( i = 0; i < 8; i++ )
{
if( (crc8 ^ byte) & 1 )
crc8 = ((crc8 ^ 0x18) >> 1) | 0x80;
else
crc8 >>= 1;
byte >>= 1;
}
return crc8;
}
Ну и функция чтения номера ключа:
Код:
/*****************************************************************************
* read_serial_number
*
* Чтение кода ключа и запись события в очередь главной задачи.
*/
static void read_serial_number()
{
static unsigned char k;
read_attempts = 240;
tm_event=no_tm_event;
k=0;
while( read_attempts-- )
{
static unsigned char n, crc8;
/* задержка через каждые 16 попыток */
if( (read_attempts & 15) == 0 )
{
timer_3=0;
while(timer_3 < 3);
}
tm_delay(512);
/* reset */
TM_TX_PULLDOWN();
tm_delay( 480 ); /* tRSTL > 480us */
/* завершаем импульс сброса, проверяем уровень, должен быть высокий */
dint();
TM_TX_RELEASE();
tm_delay( 7 ); /* 15us minimum tPDH */
if( (TM_RX_IN & TM_RX_PIN) == 0 )
{
/* вероятно, вход просто закорочен */
eint();
continue;
}
/* контролируем presence pulse */
tm_delay(80); /* 60us minimum tPDL */
n = TM_RX_IN;
eint();
if( n & TM_RX_PIN )
/* что-то не так, уровень должен оставаться низким */
continue;
/* ожидаем завершения presence pulse */
tm_delay(240); /* tPDL */
if( !(TM_RX_IN & TM_RX_PIN) )
/* таймаут */
continue;
/* выдерживаем высокий уровень tRSTH */
tm_delay( 480 );
/* посылаем команду Read ROM */
tm_send( 0x33 );
/* читаем тип устройства */
n = tm_read();
if( 0 == n )
/* тип устройства не может быть нулевым */
continue;
crc8 = new_crc8( 0, n );
/* читаем код */
for( n = 0; n < 6; n++ )
{
unsigned char code = tm_read();
tm_code[ n ] = code;
crc8 = new_crc8( crc8, code );
}
/* читаем crc8 и проверяем */
if( tm_read() != crc8 )
{
tm_event=tm_crc_error;
continue;
}
else { tm_event=tm_crc_ok; return;}
}
}
На msp430F149 все это отлично работает!
Вроде всё то же пытаюсь на Атмеге повторить - ни чего не выходит!
Читаются одни "1" - то есть все прочитанные байты = 255.
Чего надо?
Уже мозг кипит!
Уже на отдельной плате собрал и с транзистором для подтяжки - не хочет работать.
Может и ошибка то где то на поверхности, но "не поглазам"!
Осциллограф мог бы прояснить ситуацию, уже нашел за 5 тысяч в "Радиолюбителе", но получку надо ждать.