|
Проблема с I2C в MSP430F2617, Протокол не функционирует как положено. |
|
|
|
Oct 6 2010, 13:02
|

Участник

Группа: Участник
Сообщений: 27
Регистрация: 28-04-10
Из: город Харьков
Пользователь №: 56 948

|
Пришлось по необходимости заняться МК MSP430F2617. К счастью, для чайников в среде IAR есть примеры. Все примеры удалось запустить и отработать, кроме примера по I2C, хотя он там нужен. Привожу код в примере #include "msp430x26x.h"
unsigned char TXData; unsigned char TXByteCtr;
void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P3SEL |= 0x06; // Assign I2C pins to USCI_B0 UCB0CTL1 |= UCSWRST; // Enable SW reset UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz UCB0BR1 = 0; UCB0I2CSA = 0x48; // Slave Address is 048h UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation IE2 |= UCB0TXIE; // Enable TX interrupt
TXData = 0x01; // Holds TX data
while (1) { TXByteCtr = 1; // Load TX byte counter while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts // Remain in LPM0 until all data // is TX'd TXData++; // Increment data byte } }
//------------------------------------------------------------------------------ // The USCIAB0TX_ISR is structured such that it can be used to transmit any // number of bytes by pre-loading TXByteCtr with the byte count. //------------------------------------------------------------------------------ #pragma vector = USCIAB0TX_VECTOR __interrupt void USCIAB0TX_ISR(void) { if (TXByteCtr) // Check TX byte counter { UCB0TXBUF = TXData; // Load TX buffer TXByteCtr--; // Decrement TX byte counter } else { UCB0CTL1 |= UCTXSTP; // I2C stop condition IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag __bic_SR_register_on_exit(CPUOFF); // Exit LPM0 } }
В комментарии указано: "Этот демо связывает два MSP430 по шине I2C. Мaster передает slave. Это код для master. Он постоянно передает 00h, 01h, ..., 0ffh и демонстрирует, как подключить I2C master transmitter для передачи одного байта using прерывание USCI_B0 TX." Так вот, я запустил этот пример, и он НЕ работает так, как написано в комментарии. В чем может быть дело?
|
|
|
|
|
 |
Ответов
|
Oct 7 2010, 13:36
|

Участник

Группа: Участник
Сообщений: 27
Регистрация: 28-04-10
Из: город Харьков
Пользователь №: 56 948

|
Спасибо за код, должен сказать, что ничего военного в нем нет, и все достаточно прозрачно. Впрочем, из примеров я сделал несколько выводов. Во-первых, получается, что сам обмен включает, кроме передаваемых байтов, еще много чего (очевидно, все это организует встроенный в микроконтроллер модуль, реализующий скрытые функции I2C). Например, в примерах (и, надо полагать, в реальных программах) нет передачи адреса - в лучшем случае он указывается в специальных регистрах при настройках протокола. А кто его тогда передает? Нет там и "обрамления" передаваемых байтов (например, в адресной посылке, кроме самого 7-битного адреса, должен быть так называемый R/W бит, определяющий направление потока данных, а в обычной посылке 8 бит данных дополняются битом подтверждения). Их тоже наверняка формирует встроенный модуль. Здесь для меня из примеров теперь непонятно следующее: я там нигде не нашел и намека на определение направления потока данных (то есть каким образом будет формироваться этот самый R/W бит). А это может быть определяющим для программирования обмена. Например, в процессе работы с каким-либо устройством нужно запросить состояние определенного регистра. Для этого нужно послать запрос (ПЕРЕДАЧА) и перейти на прием. Это как-то нужно сделать программно. Вот такие вопросы.
|
|
|
|
|
Oct 7 2010, 16:29
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Lemist @ Oct 7 2010, 19:36)  Вот такие вопросы. Как говориться в таких случаях RTFM!  Ответы на все эти вопросы есть в MSP430x2xx Family User's Guide (Rev. E), чтением которого вы видимо пренебрегли? Если у вас проблемы с английским, то купите книжку-перевод этого руководства. В соседней теме ее рекламировали.
|
|
|
|
Сообщений в этой теме
Lemist Проблема с I2C в MSP430F2617 Oct 6 2010, 13:02 rezident Во-первых, нужно напомнить, что шина I2C обязатель... Oct 6 2010, 13:22 Lemist Цитата(rezident @ Oct 6 2010, 16:22) Во-п... Oct 6 2010, 14:19  rezident Цитата(Lemist @ Oct 6 2010, 19:53) Может,... Oct 6 2010, 14:29 Lemist Гм, все оказалось донельзя тривиально. Как только ... Oct 6 2010, 16:26 Lemist Цитата(Lemist @ Oct 6 2010, 19:26) Гм, вс... Oct 7 2010, 10:12 rezident А 100кГц не устроит?
Код#define PIN_SCL (1U... Oct 7 2010, 12:08  Lemist Цитата(rezident @ Oct 7 2010, 19:29) Как ... Oct 8 2010, 08:14 Lemist Извините, что столь неугомонен, но с обменом по пр... Oct 8 2010, 11:57 rezident Цитата(Lemist @ Oct 8 2010, 17:57) Об это... Oct 8 2010, 12:06  Lemist Цитата(rezident @ Oct 8 2010, 15:06) Уваж... Oct 8 2010, 12:23   rezident Цитата(Lemist @ Oct 8 2010, 18:23) Как из... Oct 8 2010, 14:28   =DS= Разработчики USART MSP430 2xx заложили в него 2 ид... Oct 9 2010, 02:07    rezident Цитата(=DS= @ Oct 9 2010, 08:07) Кстати, ... Oct 9 2010, 18:49
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|