 ctpexhih (23.05.2010 18:53, просмотров: 10601)
 ctpexhih (23.05.2010 18:53, просмотров: 10601)
Подключаю 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; }
}
Вопрос: В чем может быть проблема????