CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

dsPIC33 DMA

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
tripper269



Joined: 06 May 2013
Posts: 33
Location: Toronto

View user's profile Send private message

dsPIC33 DMA
PostPosted: Fri Mar 11, 2016 6:29 pm     Reply with quote

Hi all,

I am working on DSC dsPIC33 starter kit DM330011. I am using CCS v5 in MplabX environment. I am trying to generate a 750 Hz tone. I tested my program with DCI write and it was working fine. Now I am trying to do the same thing with DMA. Idea is to keep CPU free for other tasks and DMA is reading slot over and over again and sending it to DCI. DCI is sending it to codec. Now if I debug my program, it works but in normal mode it doesn't. Below is the code. Please let me know if I am doing something wrong.
Code:

#include <DSC_initialize.h>

#define FRAME_SIZE             128
#define N_FRAMES            1
#define SIGNAL_SIZE          FRAME_SIZE * N_FRAMES
#bank_dma
    signed int16  TxBuffer[SIGNAL_SIZE];
#bank_dma
    signed int16  RxBuffer[SIGNAL_SIZE];   


int main(void)
{
      // Define the variables for generating the output signal.
   float f = (float)12;       //       Number of cycles per frame.
   float T = (float)1/(float)SIGNAL_SIZE;
   int n;


   setup_dci((MULTICHANNEL_MODE | DCI_SLAVE | DCI_CLOCK_INPUT |SAMPLE_RISING_EDGE | UNDERFLOW_SILENCE ),
                    (DCI_1WORD_FRAME | DCI_16BIT_WORD |DCI_1WORD_INTERRUPT),RECEIVE_SLOT0,TRANSMIT_SLOT0,8000);
   
   setup_dma(0, DMA_OUT_DCI, DMA_WORD);

   WM8510_Initialize();
   dci_start();

   // Generate the output waveform.
   for(n=0; n < SIGNAL_SIZE; n++)
      {
            TxBuffer[n] = sin(2*PI*f*(float)n*T) * 0x7FFF;
      }
 
       dma_start(0, DMA_CONTINOUS,TxBuffer,127);
 
   output_low(RED_LED);
   

}

.................... <DSC_initialize.h>.............................................

#include <33FJ256GP506.h>
#include <MATH.H>
#FUSES NOWDT                       //No Watch Dog Timer
#FUSES OSCIO                       //OSC2 is general purpose output
#use delay(clock = 80Mhz, internal)

#use FIXED_IO( C_outputs=PIN_C15)

#define YELLOW_LED  PIN_C13
#define GREEN_LED  PIN_C14
#define RED_LED  PIN_C15

#define SWITCH_S1 PIN_D8
#define SWITCH_S2 PIN_D9

/* WM8510 Codec Register Defines, For DSC dsPIC KIT only */
#define WM8510_SOFTWARE_RESET   0
#define WM8510_POWER_MGMT1      2
#define WM8510_POWER_MGMT2      4
#define WM8510_POWER_MGMT3      6
#define WM8510_AUDIO_INTERFACE   8
#define WM8510_COMPANDING_CTRL   10
#define WM8510_CLOCKGEN_CTRL   12
#define WM8510_ADDITIONAL_CTRL   14
#define WM8510_GPIO_STUFF      16
#define WM8510_DAC_CTRL         20
#define WM8510_DAC_VOLUME      22
#define WM8510_ADC_CONTROL      28
#define WM8510_ADC_DIGITAL_VOL   30
#define WM8510_DAC_LIMITER1      48
#define WM8510_DAC_LIMITER2      50
#define WM8510_NOTCH_FILTER1   54
#define WM8510_NOTCH_FILTER2   56
#define WM8510_NOTCH_FILTER3   58
#define WM8510_NOTCH_FILTER4   60
#define WM8510_ALC_CONTROL1      64
#define WM8510_ALC_CONTROL2      66
#define WM8510_ALC_CONTROL3      68
#define WM8510_NOISE_GATE      70
#define WM8510_PLL_N         72
#define WM8510_PLL_K1         74
#define WM8510_PLL_K2         76
#define WM8510_PLL_K3         78
#define WM8510_ATTEN_CTRL      80
#define WM8510_INPUT_CTRL      88
#define WM8510_INP_PGA_CTRL      90
#define WM8510_ADC_BOOST_CTRL   94
#define WM8510_OUTPUT_CTRL      98
#define WM8510_SPK_MIXER_CTRL   100
#define WM8510_SPK_VOLUME_CTRL   108
#define WM8510_MONO_MIXER_CTRL   112

#use i2c(master, SDA = PIN_G3, SCL = PIN_G2)





void WM8510_Initialize(void)
{
   // Codec initialization for 8K sample rates

   i2c_start();
   //Device Address - compiler understands real address * 2
        i2c_write(0x34);
   i2c_write(WM8510_SOFTWARE_RESET);
   i2c_write(0x1);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_POWER_MGMT1);
   i2c_write(0b001101111);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_POWER_MGMT2);
   i2c_write(0b000010101);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_POWER_MGMT3);
   i2c_write(0b010001001);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_AUDIO_INTERFACE);
   i2c_write(0b000011000);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_CLOCKGEN_CTRL);
   i2c_write(0b110101001);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_ADDITIONAL_CTRL);
   i2c_write(0b000001010);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_GPIO_STUFF);
   i2c_write(0b000000100);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_ADC_CONTROL);
   i2c_write(0b100001000);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_NOTCH_FILTER1);
   i2c_write(0b001000000);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_NOTCH_FILTER2);
   i2c_write(0b000000101);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_NOTCH_FILTER3);
   i2c_write(0b000111111);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_NOTCH_FILTER4);
   i2c_write(0b001111101);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_NOTCH_FILTER4);
   i2c_write(0b100000000);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_PLL_N);
   i2c_write(0b000011000);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_PLL_K1);
   i2c_write(0b000001100);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_PLL_K2);
   i2c_write(0b010010011);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_PLL_K3);
   i2c_write(0b011101001);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_INPUT_CTRL);
   i2c_write(0b000000100);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_ADC_BOOST_CTRL);
   i2c_write(0b000000000);

   i2c_start();
   i2c_write(0x34);
   i2c_write(WM8510_MONO_MIXER_CTRL);
   i2c_write(0b000000001);
   i2c_stop();

}
Ttelmah



Joined: 11 Mar 2010
Posts: 19518

View user's profile Send private message

PostPosted: Sat Mar 12, 2016 1:40 am     Reply with quote

Comment #1. Don't include libraries before the fuses/clock/serial setups.
Get in the habit of using the sequence:

Include processor file
Setup fuses
Setup clock
Do 'select' setups if appropriate
Setup peripherals (serial/I2C etc.)
Only then include libraries
Then your code

It won't matter in this case, but if you include (for instance) things like stdio, before you have the I/O defined, it won't work properly. Similarly if you include things that are dependant on timings, the clock defines must occur first.
It's just worth getting into the 'habit' of always doing the setups first. Smile

Then is it stopping with the RED LED signal low?.
If so, you do realise it'll go to sleep, before you would see more than a tiny glitch on the output?.
Remember if the code 'drops off the end', the processor goes to sleep. This will stop peripherals like the DMA. In the release notes, it says you "can't use sleep modes with the debugger", hence the difference....
tripper269



Joined: 06 May 2013
Posts: 33
Location: Toronto

View user's profile Send private message

PostPosted: Sat Mar 12, 2016 12:26 pm     Reply with quote

Awesome ! Thank you so much for your guidance Very Happy
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group