Вот написал пару функций для работы с DS18B20
Посмотрите плз, правильно ли они реализованы, в особенности меня интерисует установка "0" или "1" с помощью вкл и выкл подтягивающих резисторов. Может есть какой-нить другой способ?
CODE
#define IN (1<<29)
void writebit0(void){
AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOA, IN);//формируем низкий уровень
_delay_us(60);//по истечении 60us установит флаг DS
while(!DS);
AT91F_PIO_CfgPullup( AT91C_BASE_PIOA, IN);//формируем высокий уровень
}
void writebit1(void){
AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOA, IN);//формируем низкий уровень
_delay_us(3);
while(!DS);
AT91F_PIO_CfgPullup( AT91C_BASE_PIOA, IN);//формируем высокий уровень
_delay_us(58);
while(!DS);
}
void writebyte(unsigned char byte){
unsigned char i;
char b;
for(i=0; i<8; i++){
b = (1 << i);
if (byte&b)
writebit1();
else
writebit0();
}
}
unsigned char readbit(void){
unsigned char i;
AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOA, IN);//формируем низкий уровень
_delay_us(10);
while(!DS);
AT91F_PIO_CfgPullup( AT91C_BASE_PIOA, IN);//формируем высокий уровень
_delay_us(15);
while(!DS);
if ((AT91F_PIO_GetInput(AT91C_BASE_PIOA)& IN)==IN) i=1; else i=0;
_delay_us(35);
while(!DS);
return i;
}
signed char readbyte(void) {
unsigned char i, r, read_byte;
for(i=0, r=1, read_byte=0; i<8; i++){
if (readbit())
read_byte|=r;
r<<=1;
}
return read_byte;
}
Причина редактирования: Уменьшение видимого размера цитаты исходника.