ctpexhih (23.05.2010 18:53, просмотров: 10084)
Подключаю DS18B20 (датчик температуры 1-wire) к MSP430F1491, использую USART, ноги контроллера P3.4 и P3.5 на плате физически соединены дорожкой, никакой доп. схемки для открытого коллектора на ноге P3.5 я не делал. Определяет датчик без проблем (т.е. видно импульс presence), а вот с обменом данными проблема. Запускаю преобразование Т, потом жду 2 сек, потом пытаюсь читать данные. Проблема в том, что ВСЕ биты и байты при чтении scratchpad ВСЕГДА читаются как "1". Если ногу DQ датчика замкнуть на землю, то читается все как и должно - одни "0". USART конфигурируется согласно рекомендаций.
Вот так опрашиваю датчик:
char RESET_1W(void)
{
//На выходе: 1 - устройство есть, 0 - устройства нет
//Конфигурация UART0: 9600 бод, 8 бит, контроля четности нет, 1 стоп-бит.
U0CTL |= SWRST; //Удержание логики в сбросе
U0CTL |= CHAR; //Восьмибитный режим
U0TCTL |= SSEL1; //Источник тактирования - SMCLK
U0BR1 = 0x03; //9600 бод при 8 МГц =>
U0BR0 = 0x41; //8000000/9600 = 833,(3). 833(10) = 0x341(16)
U0MCTL = BIT1 + BIT4 + BIT7; //Учитывает 0,(3)
ME1 |= BIT7 + BIT6; //Включение приемников/передатчиков UART0
U0CTL &= ~SWRST; //Разрешение работы
U0TXBUF = 0xF0;
do{}
while(IFG1 & URXIFG0); //Ждем приема
//Если приняли то, что передавали, то устройства нет, иначе - есть.
if(U0RXBUF == 0xF0) { return 0; }
else { return 1; }
}
Так читаю бит:
char READ_BIT_1W(void)
{
//Читает бит из устройства
//USART переконфигурируется на 115200 бод в вызывающей функции
//Read '0': TX: 0xFF, RX: 0xFE или меньше
//Read '1': TX: 0xFF, RX: 0xFF
U0TXBUF = 0xFF;
do{}
while(IFG1 & URXIFG0); //Ждем приема
//Если приняли то, что передавали, то прочитали '1'
if(U0RXBUF == 0xFF) { return 1; }
else { return 0; }
}
Вопрос: В чем может быть проблема????