Пытаюсь работать с термометром DS1820 Повесил его на PA11 своего МК. Питание у него внешнее, не паразитное. Кидаю ему reset - получаю ответ. А вот на посылки типа "выдай температуру" или даже "выдай свой уникальный код" он просто не отвечает.
Идея в коде пока такая. Процедура DS1820_Init дает импульс. Получает ответный импульс. Если ответный импульс был - загорается желтый светодиодик на плате. Потом посылается запрос. Если в ответ что-то пришло, загорается зеленый светодиодик. Так вот желтый загорается, а зеленый ни в какую.
Посмотрите, пожалуйста, код. Может, я что-то упустил. Надеюсь, код легко читаем. Написан под GCC.
Код как файл мне прицепить не дают. Пришлось запузырить в текст.
#include "include/includes.h"
#define WIRE (1<<11) // a pin number, connected to data line define after <<
// Номер пина, который соединен с шиной 1-wire после <<
#define TX AT91F_PIO_CfgOutput (AT91C_BASE_PIOA, WIRE) // config to send signals
// режим отправки сигналов
#define RX AT91F_PIO_CfgInput (AT91C_BASE_PIOA, WIRE) // config to get signals
// переключает ножку в режим приема импульсов
#define TXON AT91C_BASE_PIOA->PIO_SODR = WIRE // ON pin
// подать импульс
#define TXOFF AT91C_BASE_PIOA->PIO_CODR = WIRE // OFF off pin
// отключить импульс
/* Initialization of 1-wire bus
* Инициализация шины 1-wire */
void DS1820_Init (void){
//enable the clock of the PIO
//Включение тактирования опроса пинов PIO (иначе будет не прочитать состояние пина)
AT91F_PMC_EnablePeriphClock (AT91C_BASE_PMC, (1 << AT91C_ID_PIOA));
unsigned long j; //переменная для цикла чтения состояния пина
TXOFF;
ON=GREEN; //отключить зеленый светодиод. На моей плате они работают инверсно...
reset_devices(); //перезагрузка устройств на 1-wire шине
//Listen incoming presence signals
//Прием входящих сигналов с с шины
RX; //Swith pin to read mode
//Втечение 480 мс ждем импульса готовности устройств.
for (j = 1000*480; j != 0; j-- ){ //during 480 ms read WIRE to get presence pulse
if (!AT91F_PIO_IsInputSet(AT91C_BASE_PIOA, WIRE)) { //When line is down
OFF=YELLOW; //turn on YELLOW if get impulse (inversed for my board)
//ON=YELLOW; //turn on GREEN LED if get signal
}
}
delay(100);
/* Передача битов разбита по тайм-слотам. Слот инициируется вызовом TXON с последующей паузой 15 мс.
* Затем, если надо передать на шину 0, ждем 15-45 мс. и даем TXOFF.
* Если надо передать 1, то сразу по истечении 15 ms даем TXOFF и ждем 15-45 мс.
* Перед началом следующего тайм-слота надо подождать не менее 1 мс.
*
* Bits translation is devided into timeslots. Timeslot initializes by TXON and pause 15 ms.
* Then, if you send 0, wait 15-45 ms. and do TXOFF.
* If you need to send 1, then after 15 ms do TXOFF and wait 15-45 ms.
* Before next timeslot wait not less 1 ms. */
TX;
TXOFF;
sendbyte (0,0,0,0,1,1,1,1); //send F0h
//sendbyte (1,1,1,1,0,0,0,0); //я пробовал послать команду и наоборот...
//Listen incoming signals
RX; //Swith pin to read mode
delay(1);
for (j = 1000*1000480; j != 0; j-- ){
if (!AT91F_PIO_IsInputSet(AT91C_BASE_PIOA, WIRE)) {
OFF=GREEN; //turn on YELLOW if thermometer answeres
}
}
delay(1000000);
}
/* Sends 1 bit during one time slot
* Отправляет 1 бит за один таймслот */
void sendbit (int

{
// Перед обращением включить TX! Before call this func. call TX!
TXON;
if (b==0) {
delay(15);
delay(45);
TXOFF; //send 0
} else {
delay(15);
TXOFF;
delay(45); //send 1
}
//minimum time between bits (timeslots in datasheet) should be 1 ms
delay(50);
}
void sendbyte (int a, int b, int c, int d, int e, int f, int j, int k) {
sendbit(a);
sendbit(

;
sendbit©;
sendbit(d);
sendbit(e);
sendbit(f);
sendbit(j);
sendbit(k);
}
//Reset 1-wire devices
void reset_devices (void) {
//set wire for out and send outgoing line reset signal (480 ms minimum)
TX; //Swith pin to send mode
TXON; //Turn on the pin
delay(480); //Wait
TXOFF; //Turn off the pin
delay(40); //A small pause to give the DS1820 feel the edge
}