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

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


Участник
*

Группа: Участник
Сообщений: 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." Так вот, я запустил этот пример, и он НЕ работает так, как написано в комментарии. В чем может быть дело?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Lemist
сообщение Oct 7 2010, 13:36
Сообщение #2


Участник
*

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



Спасибо за код, должен сказать, что ничего военного в нем нет, и все достаточно прозрачно.
Впрочем, из примеров я сделал несколько выводов.
Во-первых, получается, что сам обмен включает, кроме передаваемых байтов, еще много чего (очевидно, все это организует встроенный в микроконтроллер модуль, реализующий скрытые функции I2C).
Например, в примерах (и, надо полагать, в реальных программах) нет передачи адреса - в лучшем случае он указывается в специальных регистрах при настройках протокола. А кто его тогда передает?
Нет там и "обрамления" передаваемых байтов (например, в адресной посылке, кроме самого 7-битного адреса, должен быть так называемый R/W бит, определяющий направление потока данных, а в обычной посылке 8 бит данных дополняются битом подтверждения). Их тоже наверняка формирует встроенный модуль.
Здесь для меня из примеров теперь непонятно следующее: я там нигде не нашел и намека на определение направления потока данных (то есть каким образом будет формироваться этот самый R/W бит). А это может быть определяющим для программирования обмена.
Например, в процессе работы с каким-либо устройством нужно запросить состояние определенного регистра. Для этого нужно послать запрос (ПЕРЕДАЧА) и перейти на прием. Это как-то нужно сделать программно.
Вот такие вопросы.
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 7 2010, 16:29
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Lemist @ Oct 7 2010, 19:36) *
Вот такие вопросы.
Как говориться в таких случаях RTFM! smile.gif Ответы на все эти вопросы есть в MSP430x2xx Family User's Guide (Rev. E), чтением которого вы видимо пренебрегли? Если у вас проблемы с английским, то купите книжку-перевод этого руководства. В соседней теме ее рекламировали.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


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


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