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

dj_miles

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный
  1. Да как то привык уже писать без библиотечных функций. Да и какая разница как писать железка все равно работает одинаково, а писанины будет больше - я так предполагаю.
  2. Народ может кто знает рабочий пример для 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. Выкладываю свой тестовый проект, может кому понадобиться. Камень PIC24FJ64GA004. Среда MPLAB IDE. Компилятор XC16. В кратце опишу: TLV320 работает в Master-режиме, так как в slave добиться нормальной и стабильной работы так и не удалось, да и работать как оказалось в этом режиме очень удобно. Возможно это связано с процедурой сброса. Частота тактирования кодека взята с PIC, с выхода частоты переферии( у меня внутренний генератор с PLL 32 мГц, выход на лапе 16 мГц). В проекте есть файл ded.h - это тестовый кусочек для воспроизведения. Для теста микрофонного входа можно соеденить сигнал SPI_DIN_1 и SPI_DOUT_1, тогда все , что вы говорите в микрофон можно сразу услышать в динамике. В целом кодек не плохой. Мощности для динамика маловато или может, что то с конфигурацией намудрил. А так качество вполне неплохое. Будут вопросы, с удовольствием отвечу! TLV320AIC12k_Test.zip
  6. Короче сделал щас так: перевел его в режим мастера и все как по маслу работает. Вот теперь вопрос: почему он в слейв режиме не хотел записывать значения регистров?!!! Остается загадкой! Так ведь судя по всему касаясь шины I2C, он ведь так и остался в слейв режиме! По поводу подтверждения: согласен! Указанный флаг просто не учитывается у меня, но по факту читается бы ло ли подтверждение от слейва.
  7. На схеме не указаны, но на самом деле стоят. По поводу номиналов: я так понимаю, что он выбирается в зависимости огт скорости? У меня сейчас стоят 1к.
  8. Спасибо за поправки!!! Даташит на 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. Здравствуйте! Помогите разобраться с данным кодеком!!! В частности не получается конфигурировать его. Кодеком управляет PIC-контроллер по I2C интерфейсу, а тактируется от внутреннего генератора PIC'а 16 мГц. Сам же кодек юзаю в slave - режиме. Проблема заключается в записи регистров. Чтение проходит на ура, если читать по одному регистру. Прочитать все регистры разом не получается. Алгоритм чтения и записи выполняю точно так как описано в даташите. Что не так? Может кто то имел дело с данным чудом!!!!
×
×
  • Создать...