|
|
  |
Термодатчик AD7814 по SPI, Чтение регистра температуры |
|
|
|
Nov 16 2007, 07:25
|
Участник

Группа: Новичок
Сообщений: 69
Регистрация: 12-10-05
Из: Калуга
Пользователь №: 9 539

|
Здравствуйте! Кто-нибудь реализовывал работу с температурным датчиком AD7814 по SPI? Подкажите, как настроить SPI Chip Select Register (CSR1)? В описании AD7814 написано "Data is clocked out on the falling edge of SCLK", поэтому в CSR1 задаю AT91C_SPI_CPOL = 1, AT91C_SPI_NCPHA = 0. Это правильно? В считываемых шестнадцати битах какие 10 бит являются данными D9..D0? Присутствует ли в в этих 16 считанных битах LEADING ZERO?
|
|
|
|
|
Nov 16 2007, 07:51
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 16-03-05
Пользователь №: 3 407

|
Цитата(junkl @ Nov 16 2007, 11:25)  ... задаю AT91C_SPI_CPOL = 1, AT91C_SPI_NCPHA = 0. Это правильно? правильно. Цитата(junkl @ Nov 16 2007, 11:25)  В считываемых шестнадцати битах какие 10 бит являются данными D9..D0? Присутствует ли в в этих 16 считанных битах LEADING ZERO? младшие 10 бит являются данными D9..D0, а остальные LEADING ZERO.
|
|
|
|
|
Nov 16 2007, 08:04
|
Участник

Группа: Новичок
Сообщений: 69
Регистрация: 12-10-05
Из: Калуга
Пользователь №: 9 539

|
Спасибо за быстрый ответ!
В чем тогда у меня может быть проблема? Я читаю несколько раз по 16 бит, получаю непонятные значения: 0b0010110011111111 0b0000110111111111 0b0010111111111111 0b0010110100000000 0b0010110100000000
Если считать младшие биты (справа) за значение температуры, то она получается либо отрицательной, либо слишком большой (и вообще значение нестабильно), а LEADING ZERO вообще непонятно где. Что может быть неправильно настроено? Я настроила Baud rate на 1МГц, а вот задержки не знаю, какие нужны...
|
|
|
|
|
Nov 16 2007, 08:42
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 16-03-05
Пользователь №: 3 407

|
Прошу прощения за неправильную информацию, попутал микросхемы. Bit16 Bit15 Bit14 ... Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 LEADING ZERO D9 D8 ... D0 D0 D0 D0 D0 D0 D0 вот так правильно
|
|
|
|
|
Nov 16 2007, 08:59
|
Участник

Группа: Новичок
Сообщений: 69
Регистрация: 12-10-05
Из: Калуга
Пользователь №: 9 539

|
Цитата(SDS28 @ Nov 16 2007, 11:42)  Прошу прощения за неправильную информацию, попутал микросхемы. Bit16 Bit15 Bit14 ... Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 LEADING ZERO D9 D8 ... D0 D0 D0 D0 D0 D0 D0 вот так правильно  Спасибо, а почему тогда значения все равно получаются сильно разными и сильно большими, например, 90-95 град.? У меня тут прохладно :-)
|
|
|
|
|
Nov 16 2007, 09:18
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 16-03-05
Пользователь №: 3 407

|
А что Вы в нее пишете?
|
|
|
|
|
Nov 16 2007, 10:19
|
Участник

Группа: Новичок
Сообщений: 69
Регистрация: 12-10-05
Из: Калуга
Пользователь №: 9 539

|
Цитата(SDS28 @ Nov 16 2007, 12:18)  А что Вы в нее пишете? Я вообще ничего в нее не пишу, никак не конфигурирую. А надо?
|
|
|
|
|
Nov 16 2007, 10:34
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 16-03-05
Пользователь №: 3 407

|
Цитата(junkl @ Nov 16 2007, 14:19)  Я вообще ничего в нее не пишу, никак не конфигурирую. А надо? На шине SPI запись и чтение идут одновременно, и если вывод DIN AD7814 подключен к MOSI процессора, то содержимое регистра SPI_TDR попадает в ее регистр конфигурации. А дальше см. DataSheet стр. 6, "Write operation".
|
|
|
|
|
Nov 16 2007, 12:39
|
Частый гость
 
Группа: Новичок
Сообщений: 170
Регистрация: 26-05-05
Из: Москва
Пользователь №: 5 405

|
Цитата(junkl @ Nov 16 2007, 12:59)  Спасибо, а почему тогда значения все равно получаются сильно разными и сильно большими, например, 90-95 град.? У меня тут прохладно :-) Например так: Код int main( void ) { unsigned char bDataL = 0x01; // младшфий байт, полученный от AD7814 unsigned char bDataH = 0x01; // старший байт, полученный от AD7814 unsigned short wData = ( bDataH << 8 ) | bDataL; float fRealTemp; char ch = '-';
// 0b 0000 00x0 0000 0000 // 0b 0000 0011 1111 1111 if ( wData & 0x200 ){ // отрицательная температура fRealTemp = ( ~wData & 0x1FF ) * 0.25; } else { // положительная температура fRealTemp = ( wData & 0x1FF ) * 0.25; ch = ' '; } printf( "t°C = %c%f\n", ch, fRealTemp ); } Удачи!
|
|
|
|
|
Nov 20 2007, 10:34
|
Участник

Группа: Новичок
Сообщений: 69
Регистрация: 12-10-05
Из: Калуга
Пользователь №: 9 539

|
Всем большое спасибо! Оказалось, что я действительно при чтении еще и записывала в AD7814 ненулевое значение (неправильноинициализировала PDC). Теперь разобралась, все работает, как надо!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|