Перейти к содержанию

dj_miles

Участник
  • Публикаций

    9
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. PIC32MZ2048ECH064: DMA и UART

    Цитата(Valentine Loginov @ Mar 25 2015, 09:52) Воспользуйтесь гармонией. Желательно готовым драйвером для работы с USART и использованием DMA. Да как то привык уже писать без библиотечных функций. Да и какая разница как писать железка все равно работает одинаково, а писанины будет больше - я так предполагаю.
  2. PIC32MZ2048ECH064: DMA и UART

    Народ может кто знает рабочий пример для MX-серии? Перепробовал все примеры из референсов результат тот-же, что делать хз!!!
  3. PIC32MZ2048ECH064: DMA и UART

    Здравствуйте! Ситуация такая: по UART приходит строка длиной 80 байт hfp d ctreyle, ее нужно принять и записать в буфер с последующей обработкой. Для этой задачи решил прикрутить DMA. Возникла такая ситуация: строка записывается только один раз, т.е. первый раз записали и все дальше буфер не обновляется, хотя прерывания от DMA генерируются. Что я не так делаю? Помогите кто чем сможет. Заранее все спос!!!!! Код инициализации: Код    unsigned char buf[100];     U2BRG  = 87;//115200     U2STA  = 0;     U2MODE   = 0x00008008; //Enable Uart for 8-bit data no parity, 1 STOP bit     U2STASET = 0x00001410;     DCH0SSA = (unsigned int) &U2RXREG   & 0x1FFFFFFF;  // source start address     DCH0DSA = (unsigned int) &buf & 0x1FFFFFFF;  // destination start address     DCH0SSIZ = 1;               // source size     DCH0DSIZ = 80;              // destination size     DCH0CSIZ = 1;               // cell size     //DCH0DAT = '*';              //Последовательность остановки     DCH0ECONbits.CHSIRQ = _UART2_RX_VECTOR;  // Заполнение буфера по прерывании UART     DCH0ECONbits.SIRQEN = 1;  //     //DCH0ECONbits.PATEN  = 1; // Разрешить остановку по детектировании заданной последовательности     //DCH0CONbits.CHPATLEN = 0; //Длина последовательности остановки 1 байт     DCH0CONbits.CHPRI    = 3; // Приоритет канала     DCH0CONbits.CHEN     = 1; // Включаем канал DMA     DCH0INTbits.CHBCIE   = 1; // Включить прерывание по приему 80 байт Прерывание: Кодvoid __ISR(_DMA0_VECTOR, ipl6) __DMA0Interrupt(void) {     if(DCH0INTbits.CHBCIF) F_RX = 1;     DCH0INTbits.CHBCIF = 0;     DCH0INTbits.CHBCIE = 1;     if(U2OERR) U2OERR = 0; // Если было переполнение буфера UART     DMA0IF = 0; } Обработка в программе, вывод по 485: Код        if(F_RX)         {             F_RX  = 0;             DMACON = 0;             LED_RED = 1;             LED_GRN = 0;             TX_UART2(&buf);             while (!U2STAbits.TRMT);             LED_RED = 0;             LED_GRN = 1;             DMACON   = 0x8000;             DCH0CONbits.CHEN   = 1;         }
  4. PIC32MZ

    Возможно по тому, что не настроили камень. В коде не вижу конфигурации, типа такой: /* SYSCLK = 200 MHz (8MHz Crystal / FPLLIDIV * FPLLMUL / FPLLODIV) */ #pragma config FPLLIDIV = DIV_3, FPLLMULT = MUL_40, FPLLODIV = DIV_2 #pragma config FPLLRNG = RANGE_5_10_MHZ, FPLLICLK = PLL_POSC, FNOSC = SPLL #pragma config FSOSCEN = OFF, IESO = ON, POSCMOD = EC, FCKSM = CSECMD #pragma config FDMTEN = OFF, DMTCNT = DMT31, FWDTEN = OFF, ICESEL = ICS_PGx1 #pragma config OSCIOFNC = ON//, CP = ON Конфигурация для использования внутреннего тактового генератора и настройкой PLL для тактовой частоты 200 мГц Вообще камень довольно мудреный, но если разобраться, то он очень гибкий в использовании. К стати, настройка частоты периферии лучше делать так: SYSKEY = 0x0; // Ensure OSCCON is locked SYSKEY = 0xAA996655; // Write Key1 to SYSKEY SYSKEY = 0x556699AA; // Write Key2 to SYSKEY OSCCONbits.FRCDIV = 0; while( !PB2DIVbits.PBDIV );//SPI, I2C, UART PB2DIVbits.PBDIV = 4; while( !PB2DIVbits.PBDIV ); PB2DIVbits.ON = 1; while( !PB2DIVbits.PBDIV ); while( !PB3DIVbits.PBDIV );//Timers Comp PB3DIVbits.PBDIV = 0b0000001; while( !PB3DIVbits.PBDIV ); PB3DIVbits.ON = 1; while( !PB3DIVbits.PBDIV ); while( !PB4DIVbits.PBDIV );//Ports PB4DIVbits.PBDIV = 0b0000001; while( !PB4DIVbits.PBDIV ); PB4DIVbits.ON = 1; while( !PB4DIVbits.PBDIV ); SYSKEY = 0x0; // Ensure OSCCON is locked
  5. Нужна помощь с кодеком TLV320AIC12K

    Выкладываю свой тестовый проект, может кому понадобиться. Камень PIC24FJ64GA004. Среда MPLAB IDE. Компилятор XC16. В кратце опишу: TLV320 работает в Master-режиме, так как в slave добиться нормальной и стабильной работы так и не удалось, да и работать как оказалось в этом режиме очень удобно. Возможно это связано с процедурой сброса. Частота тактирования кодека взята с PIC, с выхода частоты переферии( у меня внутренний генератор с PLL 32 мГц, выход на лапе 16 мГц). В проекте есть файл ded.h - это тестовый кусочек для воспроизведения. Для теста микрофонного входа можно соеденить сигнал SPI_DIN_1 и SPI_DOUT_1, тогда все , что вы говорите в микрофон можно сразу услышать в динамике. В целом кодек не плохой. Мощности для динамика маловато или может, что то с конфигурацией намудрил. А так качество вполне неплохое. Будут вопросы, с удовольствием отвечу!
  6. Нужна помощь с кодеком TLV320AIC12K

    Короче сделал щас так: перевел его в режим мастера и все как по маслу работает. Вот теперь вопрос: почему он в слейв режиме не хотел записывать значения регистров?!!! Остается загадкой! Так ведь судя по всему касаясь шины I2C, он ведь так и остался в слейв режиме! По поводу подтверждения: согласен! Указанный флаг просто не учитывается у меня, но по факту читается бы ло ли подтверждение от слейва.
  7. Нужна помощь с кодеком TLV320AIC12K

    Цитата(Jury093 @ Feb 25 2014, 14:37) ну вот так заметно лучше.. по электросхеме - использована шина i2c, а где подтяжки (pullup)? шина с ОК и должны стоять резисторы от контактов scl и sda на +3в3 (в диапазоне 4к7..10к) На схеме не указаны, но на самом деле стоят. По поводу номиналов: я так понимаю, что он выбирается в зависимости огт скорости? У меня сейчас стоят 1к.
  8. Нужна помощь с кодеком TLV320AIC12K

    Спасибо за поправки!!! Даташит на TLV320AIC12K TLV320AIK12, схема в файле. Коды функций работы с I2C: void IIC_STR() { I2C2CONbits.SEN = 1; while (I2C2CONbits.SEN); } void IIC_RST() { I2C2CONbits.RSEN = 1; while (I2C2CONbits.RSEN); } void IIC_STP() { I2C2CONbits.PEN = 1; while (I2C2CONbits.PEN);} void IIC_WTX(unsigned char data){I2C2TRN = data; while (I2C2STATbits.TRSTAT == 1); while (I2C2STATbits.TBF == 1);} unsigned char IIC_WRX() { I2C2CONbits.RCEN = 1; while (I2C2CONbits.RCEN);I2C2CONbits.ACKEN = 1; while (I2C2CONbits.ACKEN); I2C2STATbits.I2COV = 0; return I2C2RCV;} void IIC_IDL(){ while(I2C2CONbits.SEN || I2C2CONbits.RSEN || I2C2CONbits.PEN || I2C2CONbits.RCEN || I2C2CONbits.ACKEN || I2C2STATbits.TRSTAT);} void IIC_ACK() { I2C2CONbits.ACKEN = 1; while (I2C2CONbits.ACKEN);} void I2C_Write(unsigned char add, unsigned char byte) { IIC_IDL(); IIC_STR(); IIC_WTX(0x80); IIC_WTX(add); IIC_STP(); IIC_IDL(); IIC_STR(); IIC_WTX(0x80); if (I2C2STATbits.ACKSTAT); IIC_WTX(add); if (I2C2STATbits.ACKSTAT); IIC_WTX(byte); if (I2C2STATbits.ACKSTAT); IIC_STP(); } unsigned char I2C_Read(unsigned char add) { unsigned char r = 0; IIC_IDL(); IIC_STR(); IIC_WTX(0x80); IIC_WTX(add); IIC_STP(); IIC_STR(); IIC_WTX(0x81); r = IIC_WRX(); IIC_STP(); return r; } Забыл коменты написать! Коды функций работы с I2C: void IIC_STR() { I2C2CONbits.SEN = 1; while (I2C2CONbits.SEN); } void IIC_RST() { I2C2CONbits.RSEN = 1; while (I2C2CONbits.RSEN); } void IIC_STP() { I2C2CONbits.PEN = 1; while (I2C2CONbits.PEN);} void IIC_WTX(unsigned char data){I2C2TRN = data; while (I2C2STATbits.TRSTAT == 1); while (I2C2STATbits.TBF == 1);} unsigned char IIC_WRX() { I2C2CONbits.RCEN = 1; while (I2C2CONbits.RCEN);I2C2CONbits.ACKEN = 1; while (I2C2CONbits.ACKEN); I2C2STATbits.I2COV = 0; return I2C2RCV;} void IIC_IDL(){ while(I2C2CONbits.SEN || I2C2CONbits.RSEN || I2C2CONbits.PEN || I2C2CONbits.RCEN || I2C2CONbits.ACKEN || I2C2STATbits.TRSTAT);} void IIC_ACK() { I2C2CONbits.ACKEN = 1; while (I2C2CONbits.ACKEN);} void I2C_Write(unsigned char add, unsigned char byte) { IIC_IDL(); //Ожидаем освобождения модуля I2C IIC_STR(); // Последовательность старт-бита IIC_WTX(0x80);//Адрес слейва с признаком записи if (I2C2STATbits.ACKSTAT); //Проверка подтверждения IIC_WTX(add); //Адрес регистра if (I2C2STATbits.ACKSTAT); IIC_WTX(byte); //Значение регистра if (I2C2STATbits.ACKSTAT); IIC_STP();//Стоп-бит } unsigned char I2C_Read(unsigned char add) { unsigned char r = 0; //Запись индекса регистра IIC_IDL(); //Ожидаем освобождения модуля I2C IIC_STR();// Последовательность старт-бита IIC_WTX(0x80);//Адрес слейва с признаком записи IIC_WTX(add); //Адрес регистра IIC_STP(); //Стоп-бит IIC_STR(); //Старт-бит IIC_WTX(0x81); //Адрес слейва с признаком чтения r = IIC_WRX(); //Чтение IIC_STP(); //Стоп-бит return r; }
  9. Нужна помощь с кодеком TLV320AIC12K

    Здравствуйте! Помогите разобраться с данным кодеком!!! В частности не получается конфигурировать его. Кодеком управляет PIC-контроллер по I2C интерфейсу, а тактируется от внутреннего генератора PIC'а 16 мГц. Сам же кодек юзаю в slave - режиме. Проблема заключается в записи регистров. Чтение проходит на ура, если читать по одному регистру. Прочитать все регистры разом не получается. Алгоритм чтения и записи выполняю точно так как описано в даташите. Что не так? Может кто то имел дело с данным чудом!!!!