Тайминги все выдержал(рис3), послал 8 байт данных, хочу прочитать CRC-16 (в коде все написано где), а в ответ ничего. Все делал по примеру стр 22( даташит DS2431). На рисунке 2 представлена работа программы. Устройство отвечает.
Что не так делаю, не пойму?
CODE
#include <avr/io.h>
//#include <avr/interrupt.h>
#define F_CPU 8000000UL
#include <util/delay.h>
//#include <predef.h>
#define DELAY_US(__delay) _delay_us(__delay)
#define OW_RESET() DDRD|=(1<<DDD0);\
PORTD&=~(1<<PD0);\
DELAY_US(500);\
DDRD&=~(1<<DDD0);\
PORTD|=(1<<PD0);\
DELAY_US(65);\
if((PIND&(1<<PIND0))==0)\
{\
DevDetect=1;\
PORTD|=(1<<PD1);\
PORTD&=~(1<<PD1);\
}\
else\
DevDetect=0;\
DELAY_US(420)
#define OW_SEND_ONE() DDRD|=(1<<DDD0);\
PORTD&=~(1<<PD0);\
DELAY_US(10);\
DDRD&=~(1<<DDD0);\
PORTD|=(1<<PD0);\
DELAY_US(100)
#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(); //Reset
OW_SendByte(0xCC); //Skip ROM
OW_SendByte(0x0F); //Write Scratchpad
OW_SendByte(0x20); //TA1
OW_SendByte(0x00); //TA2
// Записываем 8 байт данных
OW_SendByte(0x11);
OW_SendByte(0x22);
OW_SendByte(0x33);
OW_SendByte(0x44);
OW_SendByte(0x55);
OW_SendByte(0x66);
OW_SendByte(0x77);
OW_SendByte(0x88);
// Начинаем чтение
DDRD|=(1<<DDD0);
PORTD&=~(1<<PD0);
DELAY_US(10);
DDRD&=~(1<<DDD0);
PORTD|=(1<<PD0);
DELAY_US(100);
// смотрю где закончилась запись данных
PORTD|=(1<<PD1);
PORTD&=~(1<<PD1);
// !!!Здесь я должен увидеть CRC-16, но но графике нет ответа
/*OW_RESET();
OW_SendByte(0xCC);
OW_SendByte(0xAA);
_delay_ms(30);
PORTD|=(1<<PD1);
PORTD&=~(1<<PD1);
OW_RESET();
OW_SendByte(0xCC);
OW_SendByte(0x55);
OW_SendByte(0x20);
OW_SendByte(0x00);
OW_SendByte(0x07);
PORTD|=(1<<PD1);
PORTD&=~(1<<PD1);
DELAY_US(200);
PORTD|=(1<<PD1);
PORTD&=~(1<<PD1);
OW_RESET();
OW_SendByte(0xCC);
OW_SendByte(0xF0);
OW_SendByte(0x00);
OW_SendByte(0x00);
PORTD|=(1<<PD1);
PORTD&=~(1<<PD1);*/
return DevDetect;
}
void OW_SendByte(BYTE val)
{
//for(int i=7; i>=0; --i)
for(int i=0; i<8; ++i)
{
if(val&(1<<i))
{
OW_SEND_ONE();
}
else
{
OW_SEND_ZERO();
}
}
}
Сообщение отредактировал ks007 - Jun 11 2011, 10:06
Эскизы прикрепленных изображений