|
MSP-EXP430F5529, I2C slave transmitter проблема |
|
|
|
Oct 5 2011, 15:50
|
Частый гость
 
Группа: Участник
Сообщений: 109
Регистрация: 19-01-11
Пользователь №: 62 335

|
Добрый день!
Есть борд MSP-EXP430F5529. Запускаю I2C. Среда IAR. Загрузил пример от TI MSP430F55xx_uscib0_i2c_05, который делает борд ведомым передатчиком и отправляет число по I2C мастеру. Заметил странность, мастер получает числа как будто деленные на 2. В теле программы создал константу и отправляю ее на передачу, мастером вижу, что число в два раза меньше, к примеру оправляю 0xAA получаю 0x55, отправляю 0хFF получаю 0x7F. Такое ощущение что сдвиговый регистр отнимает единицу от количества требуемых сдвигов, из-за этого получается деление на два. Читал мануал, код вроде правильный, а непонимание есть. Что это такое, как это понять и устранить?
|
|
|
|
|
 |
Ответов
|
Oct 11 2011, 06:35
|
Частый гость
 
Группа: Участник
Сообщений: 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.
|
|
|
|
Сообщений в этой теме
*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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|