hello,
I am using C6748, trying to send data through mcbsp port. I followed initialization procedure found in the (technical Ref manual) but I am a little bit confused about values of (SRGR) register, especially FWID & FPER.
I need to send data frame of 5 bytes at a time, on the oscilloscope CLKS1 is good, FSX1 looks good (pulse) but the output data is creepy.I set FPER to 64 and FWID to 40.
what are the proper values to these register fields.
here are the functions I used for initialization and data transmission and I hope some one will provide me with help
#include "mcbsp.h" #include "main.h" #include "evmc6748.h" /*-------PINMUX-------*/ #define PINMUX_MCBSP1_REG (1) #define PINMUX_MCBSP1_MASK (0x0F0F0F00) #define PINMUX_MCBSP1_VAL (0x02020200) #define FPER_shift 16 #define CLKSM_shift 29 #define FSGM_shift 28 #define CLKGDV_shift 0 #define FWID_shift 8 #define XFRLEN1_shift 8 #define NULL 0 #define CLKSM_INTERNAL 1<<29 #define FSGM_DXR2XSR 0 << 28 #define FSGM_FSG 1 << 28 extern int i; uint32_t MCBSP_init (McbspRegs *mcbsp, uint8_t CLKGDV,uint8_t FPER, uint8_t FWID, uint8_t xferlen) { uint32_t rtn = ERR_INVALID_PARAMETER; if (mcbsp==MCBSP1) { EVMC6748_lpscTransition(PSC1, DOMAIN0, LPSC_MCBSP1, PSC_ENABLE); EVMC6748_pinmuxConfig( PINMUX_MCBSP1_REG, PINMUX_MCBSP1_MASK, PINMUX_MCBSP1_VAL); } //reset mcbsp registers mcbsp->SPCR=0;//hold Tx and Rx parts in reset mcbsp->XCR=0; mcbsp->SRGR=0; mcbsp->PCR=0; mcbsp->RCERE1=0; mcbsp->XCERE1=0; mcbsp->RCERE2=0; mcbsp->XCERE2=0; mcbsp->RCERE3=0; mcbsp->XCERE3=0; SETBIT(mcbsp->SRGR,(CLKGDV-1) <<CLKGDV_shift); SETBIT(mcbsp->SRGR,(FPER-1) <<FPER_shift); SETBIT(mcbsp->SRGR,(FWID-1) <<FWID_shift); SETBIT(mcbsp->SRGR,MCBSP_SRGR_CLKSM);//internal input clock SETBIT(mcbsp->SRGR,FSGM_FSG); SETBIT(mcbsp->PCR,MCBSP_PCR_FSXP| MCBSP_PCR_CLKXM | MCBSP_PCR_FSXM); SETBIT(mcbsp->XCR,XCR_XFIG_IGNORE |XCR_XDATDLY_1bit);//word length 8 bits |5 words in phase 1 | 1-bit data delay |Single-phase frame. SETBIT(mcbsp->XCR,XCR_XFRLEN1_5word); for (i=0; i<5; i++) {;} SETBIT(mcbsp->SPCR,MCBSP_SPCR_GRST);// enable bit clk generator for (i=0; i<20; i++) {;} // wait for GRST SETBIT(mcbsp->SPCR,MCBSP_SPCR_XRST);// take Tx portion out of reset for (i=0; i<5; i++) {;} //wait to check Transmit synchronization error if (CHKBIT(mcbsp->SPCR,MCBSP_SPCR_XSYNCERR))// if XSYNCERR occured CLRBIT(mcbsp->SPCR,MCBSP_SPCR_XRST); // reset transmitter to clear the error if (!CHKBIT(mcbsp->SPCR,MCBSP_SPCR_XRST)) SETBIT(mcbsp->SPCR,MCBSP_SPCR_XRST);// enable transmitter if it was reset by XSYNCERR while (!CHKBIT(mcbsp->SPCR,MCBSP_SPCR_XRDY)) {;} //wait for XRDY SETBIT(mcbsp->SPCR,MCBSP_SPCR_FRST);// enable frame sync generator return (rtn); } uint32_t MCBSP_write(McbspRegs *mcbsp, int8_t *src_buffer, int16_t in_length) { uint32_t rtn = ERR_INVALID_PARAMETER; if ((mcbsp != NULL) && (src_buffer != NULL)) { uint32_t i; uint32_t mcbsp_DXR = mcbsp->DXR; // transmit data one byte at a time, copy receive data into input buffer. for (i = 0; i < in_length; i++) { // wait for tx buffer to be empty. if (CHKBIT (mcbsp->SPCR,MCBSP_SPCR_XRDY)){ mcbsp_DXR=*src_buffer; src_buffer++; // copy the tmp reg to the real thing. mcbsp->DXR = mcbsp_DXR; } } rtn = ERR_NO_ERROR; } return (rtn); }
thanks...