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

 
 
> MSP-EXP430F5529, I2C slave transmitter проблема
*rust*
сообщение Oct 5 2011, 15:50
Сообщение #1


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

Группа: Участник
Сообщений: 109
Регистрация: 19-01-11
Пользователь №: 62 335



Добрый день!

Есть борд MSP-EXP430F5529. Запускаю I2C. Среда IAR.
Загрузил пример от TI MSP430F55xx_uscib0_i2c_05, который делает борд ведомым передатчиком и отправляет число по I2C мастеру.
Заметил странность, мастер получает числа как будто деленные на 2. В теле программы создал константу и отправляю ее на передачу, мастером вижу, что число в два раза меньше, к примеру оправляю 0xAA получаю 0x55, отправляю 0хFF получаю 0x7F.
Такое ощущение что сдвиговый регистр отнимает единицу от количества требуемых сдвигов, из-за этого получается деление на два. Читал мануал, код вроде правильный, а непонимание есть.
Что это такое, как это понять и устранить?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
*rust*
сообщение Oct 11 2011, 06:35
Сообщение #2


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

Группа: Участник
Сообщений: 109
Регистрация: 19-01-11
Пользователь №: 62 335



Резисторы по 4.7кОм. Проверяю на частоте от 400кГц и ниже. Абсолютно ничего секретного, питание FTDI и борда 3.3В резисторы есть со стороны FTDI и со стороны борда. Эти два устройства физически соединяются тремя проводами: (SDA, SCL, GND). Уже попробовал частоту тактирования MSP повышать до 25Мгц, макс. частота обмена при котором получаю нормальную, не сдвинутую дату примерно 320кГц. Могу картинку с осциллографа показать если нужно.

Вот код:
Код
#include <msp430f5529.h>

unsigned char TXData;
void SetVcoreUp (unsigned int level);

void main(void)
{
  volatile unsigned int i;

  WDTCTL = WDTPW+WDTHOLD;                   // Stop WDT
  
  P1DIR |= 0x01;                            // Set P1.0 to output direction
  P1OUT  = 0x01;

  P1DIR |= BIT1;                            // P1.1 output

  P1DIR |= BIT0;                            // ACLK set out to pins
  P1SEL |= BIT0;                            
  P2DIR |= BIT2;                            // SMCLK set out to pins
  P2SEL |= BIT2;                            
  P7DIR |= BIT7;                            // MCLK set out to pins
  P7SEL |= BIT7;          

    //*********************   I2C  ****************************
  P3SEL |= 0x03;                            // Assign I2C pins to USCI_B0
  UCB1CTL1 |= UCSSEL1;
  UCB0CTL1 |= UCSWRST;                      // Enable SW reset
  UCB0CTL0 = UCMODE_3 + UCSYNC;             // I2C Slave, synchronous mode
  UCB0I2COA = 0x48;                         // Own Address is 048h
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
  UCB0IE |= UCTXIE + UCSTTIE + UCSTPIE;     // Enable TX interrupt
                                            // Enable Start condition interrupt
  TXData = 0x7F;                            // Used to hold TX data

  //*********************************************************
  
  
  // Increase Vcore setting to level3 to support fsystem=25MHz
  // NOTE: Change core voltage one level at a time..
  SetVcoreUp (0x01);
  SetVcoreUp (0x02);  
  SetVcoreUp (0x03);  
  
  UCSCTL3 = SELREF_2;                       // Set DCO FLL reference = REFO
  UCSCTL4 |= SELA_2;                        // Set ACLK = REFO

  __bis_SR_register(SCG0);                  // Disable the FLL control loop
  UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx
  UCSCTL1 = DCORSEL_7;                      // Select DCO range 50MHz operation
  UCSCTL2 = FLLD_1 + 762;                   // Set DCO Multiplier for 25MHz
                                            // (N + 1) * FLLRef = Fdco
                                            // (762 + 1) * 32768 = 25MHz
                                            // Set FLL Div = fDCOCLK/2
  __bic_SR_register(SCG0);                  // Enable the FLL control loop

  // Worst-case settling time for the DCO when the DCO range bits have been
  // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
  // UG for optimization.
  // 32 x 32 x 25 MHz / 32,768 Hz ~ 780k MCLK cycles for DCO to settle
  __delay_cycles(782000);

  // Loop until XT1,XT2 & DCO stabilizes - In this case only DCO has to stabilize
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
                                            // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag
  
  __bis_SR_register(GIE);       // Enter LPM0 w/ interrupts
  
  while(1)
  {}
}

void SetVcoreUp (unsigned int level)
{
  // Open PMM registers for write
  PMMCTL0_H = PMMPW_H;              
  // Set SVS/SVM high side new level
  SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;
  // Set SVM low side to new level
  SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;
  // Wait till SVM is settled
  while ((PMMIFG & SVSMLDLYIFG) == 0);
  // Clear already set flags
  PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);
  // Set VCore to new level
  PMMCTL0_L = PMMCOREV0 * level;
  // Wait till new level reached
  if ((PMMIFG & SVMLIFG))
    while ((PMMIFG & SVMLVLRIFG) == 0);
  // Set SVS/SVM low side to new level
  SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;
  // Lock PMM registers for write access
  PMMCTL0_H = 0x00;
}

// USCI_B0 State ISR
#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
  switch(__even_in_range(UCB0IV,12))
  {
  case  0: break;                           // Vector  0: No interrupts
  case  2: break;                           // Vector  2: ALIFG
  case  4: break;                           // Vector  4: NACKIFG
  case  6:                                  // Vector  6: STTIFG
     UCB0IFG &= ~UCSTTIFG;                  // Clear start condition int flag
     break;
  case  8:                                  // Vector  8: STPIFG
    //TXData++;                               // Increment TXData
    UCB0IFG &= ~UCSTPIFG;                   // Clear stop condition int flag
    break;
  case 10: break;                           // Vector 10: RXIFG  
  case 12:                                  // Vector 12: TXIFG
    UCB0TXBUF = TXData;                     // TX data
    break;
  default: break;
  }
}


Скорость 320kbps:
Адрес Прикрепленный файл  adr_320.BMP ( 16.97 килобайт ) Кол-во скачиваний: 4
передача байта Прикрепленный файл  byte_320.BMP ( 15.94 килобайт ) Кол-во скачиваний: 2
стоп Прикрепленный файл  stop_320.BMP ( 12.84 килобайт ) Кол-во скачиваний: 2


Скорость 400kbps:
Адрес Прикрепленный файл  adr_400.BMP ( 17.17 килобайт ) Кол-во скачиваний: 4
передача байта Прикрепленный файл  byte_400.BMP ( 15.87 килобайт ) Кол-во скачиваний: 5
стоп Прикрепленный файл  stop_400.BMP ( 12.98 килобайт ) Кол-во скачиваний: 4


Должен добавить, что FTDI не поддерживает растягивание клоков, но скорости 400kbps, он успешно работал с C51, PIC, AVR, ARM.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- *rust*   MSP-EXP430F5529   Oct 5 2011, 15:50
- - rezident   А кто у вас мастер-то?   Oct 5 2011, 17:07
- - *rust*   Мастер FTDI-микросхема, данные смотрю на компьютер...   Oct 5 2011, 17:21
- - rezident   Дайте ссылку, откуда берете ваш пример? Или привед...   Oct 5 2011, 17:30
- - *rust*   Код#include <msp430f5529.h> unsigned char...   Oct 5 2011, 17:50
- - rezident   Вроде никакого криминала нет. А резисторы на шине ...   Oct 5 2011, 19:24
- - *rust*   по 10кОм   Oct 5 2011, 19:47
- - KARLSON   Самая лучшая проверка - осциллографом.   Oct 6 2011, 04:24
- - *rust*   Передаю 0xFF Смотрю на осциллографе прием адреса, ...   Oct 6 2011, 07:02
- - *rust*   Дополнение: После приема адреса и ответа аска, ли...   Oct 6 2011, 08:05
- - *rust*   Что еще можно посмотреть, вообще не понимаю что пр...   Oct 6 2011, 10:52
- - rezident   Уменьшите номиналы резисторов вдвое. На какой част...   Oct 6 2011, 14:21
- - *rust*   Поставил уже резисторы 4.7кОм-результат тот же. Ча...   Oct 6 2011, 15:21
- - rezident   1МГц на шине с резисторами 10 кОм??? Вы никаких,...   Oct 6 2011, 17:04
- - *rust*   ЦитатаВы никаких, извиняюсь, необычных грибов на о...   Oct 6 2011, 18:31
- - *rust*   Частоту тактирования поднял уже до 16МГц, MSP пере...   Oct 8 2011, 09:53
- - *rust*   Неужели с такой проблемой никто не сталкивался?   Oct 10 2011, 17:25
- - rezident   Дык все-таки, какие по величине резисторы pull-up ...   Oct 10 2011, 19:48
- - *rust*   Посмотрите на этот скрин (адрес). Поймал граничное...   Oct 11 2011, 09:37
|- - rezident   Цитата(*rust* @ Oct 11 2011, 14:37) Остае...   Oct 11 2011, 15:05
- - *rust*   ЦитатаА описание бага USCI30 в errata не в тему? В...   Oct 11 2011, 19:48
- - rezident   На вашей осциллограмме присутствует "ступеньк...   Oct 11 2011, 22:34
- - *rust*   Цитатаконфликт при котором помимо (взаимо)действия...   Oct 12 2011, 06:10
|- - rezident   Цитата(*rust* @ Oct 12 2011, 11:10) Поэто...   Oct 12 2011, 14:32
- - *rust*   ЦитатаДык это явное нарушение спецификации I2C...   Oct 12 2011, 17:53
|- - rezident   Цитата(*rust* @ Oct 12 2011, 22:53) А ник...   Oct 12 2011, 19:03
- - *rust*   rezident, спасибо за подробный ответ и Ваши хлопот...   Oct 12 2011, 21:10
|- - rezident   Цитата(*rust* @ Oct 13 2011, 02:10) Как В...   Oct 13 2011, 09:19
- - *rust*   Убрал FTDI. В качестве мастера выступил PIC, работ...   Oct 13 2011, 09:50
- - rezident   3,5мкс это как раз 28 тактов на 8МГц. Модель памят...   Oct 13 2011, 10:32
- - *rust*   Цитата3,5мкс это как раз 28 тактов на 8МГц. Модель...   Oct 13 2011, 10:44
- - rezident   100кГц я имел в виду, это если требуется совсем бе...   Oct 13 2011, 12:04
- - *rust*   Цитата100кГц я имел в виду Я так и понял. Спасибо ...   Oct 13 2011, 12:16


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

 


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


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