реклама на сайте
подробности

 
 
> I2C в MSP430F169
Slonic
сообщение Mar 16 2006, 09:08
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 3-10-05
Из: Москва-Троицк
Пользователь №: 9 174



Господа, разбираюсь с чудом из Техаса в связке с IAR EW 3.2 Проблема с моим непониманием, как должен работать модуль I2C. С UARTом все получилось довольно просто, а здесь что-то застопорилось.

Итак, задача. Есть контроллер с резонатором 6Мгц на месте XCLK1. Конфигурируем источник тактовой частоты и затем модуль I2C:

BCSCTL1 = 0xC0; // select clock source
BCSCTL2 = 0xC8;

P3SEL |= 0x0a; // Assign I2C pins to module
U0CTL |= I2C + SYNC; // Switch USART0 to I2C mode
U0CTL &= ~I2CEN; // Recommended I2C init procedure
I2CTCTL = 0x30; // SMCLK
I2CSCLH = 0x1D; // High period of SCL
I2CSCLL = 0x1D; // Low period of SCL
I2CNDAT = 0x01; // Transmit one byte
I2CSA = 0x4F; // Slave address = 0 1001 111
I2CIE = RXRDYIE; // Enable RXRDYIFG interrupt
U0CTL |= I2CEN; // Enable I2C, 7 bit addr,
_EINT(); // Enable interrupts

По идее, на входе модуля должна быть исходная тактовая частота 6мгц. Частота SCL соответственно должна быть 6000кГц / ((29 + 1) * 2) = 100кГц. При контроле этого пина осциллографом вижу там частоту в районе 2кГц. Откуда она берется - непонятно. При этом UART1 прекрасно работает на нужной скорости.

Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Slonic
сообщение Mar 16 2006, 13:11
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 3-10-05
Из: Москва-Троицк
Пользователь №: 9 174



Вообще какие-то непонятки.

Экспериментально подобрал работающий вариант. А именно: модуль I2C тактируется от ACLK, который представляет собой 6мгц деленные на 4. Удалось-таки получить примерно 100кГц на SCL.

BCSCTL1 = XT2OFF + XTS + DIVA_2; // ACLK = SCLK / 4
I2CTCTL = I2CSSEL_1; // ACLK
I2CPSC = 0x00; // I2C prescaler
I2CSCLH = 0x06; // High period of SCL
I2CSCLL = 0x06; // Low period of SCL

Может быть, для него 6Мгц - слишком быстро... не знаю. Но самое интересное началось дальше. Когда на шине I2C ничего, кроме мастера-контроллера нет, все нормально. Выдается байт адреса, вызывается прерывание NACK и все вроде хорошо. Когда подключаю свой термодатчик и выставляю правильный SLAVE адрес, датчик отвечает, но байт данных не передается. Но это еще не самое интересное. При попытке повторить передачу без сброса контроллера (сделал передачу I2C по команде от RS232) клок снова становится длинным - 6кГц вместо 100!

Ничего подобного не встречал ни в Микрочипе ни в Атмеле, там как-то сразу все работало ((
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th August 2025 - 08:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01369 секунд с 7
ELECTRONIX ©2004-2016