#define Audio_RAdr 0b10001101 #define Audio_WAdr 0b10001100 #include #include #include #include #include "configbits.h" #include "ports.h" #include #include //function initiates I2C1 module to baud rate BRG void i2c_init(int BRG) { int temp; // I2CBRG = 194 for 10Mhz OSCI with PPL with 100kHz I2C clock I2C1BRG = BRG; I2C1CONbits.I2CEN = 0; // Disable I2C Mode I2C1CONbits.DISSLW = 1; // Disable slew rate control IFS1bits.MI2C1IF = 0; // Clear Interrupt I2C1CONbits.I2CEN = 1; // Enable I2C Mode temp = I2C1RCV; // read buffer to clear buffer full IdleI2C1(); } void Delay(){ IFS0bits.T1IF = 0; TMR1 = 0; while(!IFS0bits.T1IF); //~70mS Delay } unsigned char writeAudioCommand( unsigned char reg,unsigned char value){ StartI2C1(); IdleI2C1(); MasterWriteI2C1(Audio_WAdr); IdleI2C1(); if(I2C1STATbits.ACKSTAT){ return 1; } MasterWriteI2C1(reg); IdleI2C1(); if(I2C1STATbits.ACKSTAT){ return 1; } MasterWriteI2C1(value); IdleI2C1(); if(I2C1STATbits.ACKSTAT){ return 1; } StopI2C1(); IdleI2C1(); Delay(); return 0; } void AudioCodecInit(){ while(writeAudioCommand(64,0x30)); Audio_RST = 0; Delay(); Audio_RST = 1; Delay(); while(writeAudioCommand(64,0x00)); //Warten bis ACK erkannt Delay(); //writeAudioCommand(0x40,0x60); writeAudioCommand(65,0xff); //Lautstärke Links writeAudioCommand(66,0xff); //Lautstärke Rechts writeAudioCommand(67,0x41); //Master/Slave writeAudioCommand(68,0); //DAC Oversample + Phase + Mute writeAudioCommand(69,80); //DAC Filter writeAudioCommand(70,215); //Lautstärke ADC = 0dB writeAudioCommand(71,215); //Lautstärke ADC = 0dB writeAudioCommand(72,0x40); //ADC Master/Slave - Data Format writeAudioCommand(73,0x08); //ADC Filter } void timerInit(){ T1CONbits.TSIDL = 1; T1CONbits.TGATE = 0; T1CONbits.TCKPS = 2; //Prescaler: 1:1 T1CONbits.TSYNC = 0; T1CONbits.TCS = 0; IFS0bits.T1IF = 0; IEC0bits.T1IE = 1; IPC0bits.T1IP = 0; TMR1 = 0; PR1 = 10000; T1CONbits.TON = 1; } void initAudioSPI(){ SPI2BUF = 0; //REGISTER 15-2: SPIXCON1: SPIx CONTROL REGISTER 1 SPI2CON1bits.DISSCK = 0; //bit 12 DISSCK: Disable SCKx pin bit (SPI Master modes only) SPI2CON1bits.DISSDO = 0; //bit 11 DISSDO: Disable SDOx pin bit SPI2CON1bits.MODE16 = 1; //bit 10 MODE16: Word/Byte Communication Select bit SPI2CON1bits.SMP = 1; //bit 9 SMP: SPIx Data Input Sample Phase bit SPI2CON1bits.CKE = 1; //bit 8 CKE: SPIx Clock Edge Select bit SPI2CON1bits.SSEN = 0; //bit 7 SSEN: Slave Select Enable (Slave mode) bit SPI2CON1bits.CKP = 0; //bit 6 CKP: Clock Polarity Select bit SPI2CON1bits.MSTEN = 0; //bit 5 MSTEN: Master Mode Enable bit SPI2CON1bits.SPRE = 0b111; //bit 4-2 SPRE<2:0>: Secondary Prescale bits (Master mode) SPI2CON1bits.PPRE = 0b11; //bit 1-0 PPRE<1:0>: Primary Prescale bits (Master mode) //REGISTER 15-3: SPIxCON2: SPIx CONTROL REGISTER 2 SPI2CON2bits.FRMEN = 1; //bit 15 FRMEN: Framed SPIx Support bit SPI2CON2bits.SPIFSD = 1; //bit 14 SPIFSD: Frame Sync Pulse Direction Control on SSx Pin bit SPI2CON2bits.SPIFPOL = 0;//bit 13 SPIFPOL: Frame Sync Pulse Polarity bit (Frame mode only) SPI2CON2bits.SPIFE = 0; //bit 1 SPIFE: Frame Sync Pulse Edge Select bit SPI2CON2bits.SPIBEN = 1; //bit 0 SPIBEN: Enhanced Buffer Enable bit //REGISTER 15-1: SPIxSTAT: SPIx STATUS AND CONTROL REGISTER SPI2STATbits.SPIROV = 0; //bit 6 SPIROV: Receive Overflow Flag bit SPI2STATbits.SISEL = 6; //TX Empty Interrupt IFS2bits.SPI2IF = 0; //REGISTER 15-1: SPIxSTAT: SPIx STATUS AND CONTROL REGISTER SPI2STATbits.SPIEN = 1; //bit 15 SPIEN: SPIx Enable bit } void sendAudio(int val){ int x; while(Audio_LRCK); x=SPI2BUF; SPI2BUF = val; //while(!SPI2STATbits.SRMPT); //while (SPI2STATbits.SPITBF); while(!Audio_LRCK); } int main() { int x[100]; int i; const double PI = 3.14159265359; const int FS = 44100; int f = 441; AD1PCFGL = 0xFFFF; TRISBbits.TRISB13 = 0;//audio reset TRISBbits.TRISB15 = 0;//shdn TRISBbits.TRISB5 = 1; //Audio_LRCK RPOR5bits.RP11R = 10; //SDO auf RB11 10 RPINR23bits.SS2R = 3; // SS2 auf RB3 (LRCK) RPINR22bits.SCK2R = 2; //CLK in auf RB2 shdn = 1; timerInit(); i2c_init(54); initAudioSPI(); AudioCodecInit(); for(i = 0;i<100;i++){ x[i] = 0xffff*sin(2*PI*f*i/FS); } i = 0; //Audio_RST = 0; while(1){ sendAudio(x[i]); //sendAudio(0xf0f0); i++; if(i==100){ i = 0; } } }