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

 
 
> 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 24 2006, 05:51
Сообщение #2


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

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



Нет, не забыл.

Этот бит (I2CWORD) отвечает за разрядность передаваемых ДАННЫХ. Т.е. когда он установлен, регистр I2CDRB рассматривается как 16-разрядный и передается два байта данных вместо одного.

В любом случае попробовал и с этим битом и без, отправляется только адрес и больше ничего. ACK приходит. И тишина...
Go to the top of the page
 
+Quote Post
Slonic
сообщение Apr 10 2006, 11:19
Сообщение #3


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

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



Рассказываю, как все было на самом деле.

Оказывается, записывать данные в регистр I2C нужно после того, как инициирована передача. Иначе, контроллер думает, что их там нет.

Иными словами, чтобы послать один байт, нужно сделать следующее:

I2CNDAT = 0x01;
U0CTL |= MST;
I2CTCTL |= I2CTRX + I2CSTT + I2CSTP;
I2CDRB = 0xEE;

Если последние две строки поменять местами, работать НЕ БУДЕТ! Надеюсь, кому-нибудь пригодится.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 13:37
Рейтинг@Mail.ru


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