This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28335: McBSP-B as SPI using the Clock Stop Mode operation with MCP2518FDT CAN controller always receive 0xFFFF in DRR[1,2] registers.

Part Number: TMS320F28335


Hello everyone,

I have some problems on the reception of SPI frames in TMS320F28335PGFA, using the McBSP-B as master. I am using the MCP2518FDT CAN controller to add some CAN functionallity through McBSP-B as SPI interface.

I can send a READ frame of 1 phase, 1 word and 32 bits to the MCP2518FDT and it answers as it is shown in the osciloscope image below. 

- Blue signal: CLK, MCLKXB

- Yellow signal: SDI, MDXB

- Pink signal: SDO, MDRB

But then if I read the DRR 1 and 2 registers they always show the same, 0xFFFF in CCS and no problems shown.

The McBSP configuration is based on the mcbsp_spi_loopback example (which works correclty for me with de DLB enabled), slightly modified for the MCP2518FDT CAN Controller (CLKSTP=3), shown in the following code snippet:

void InitMcbspb(void)
{
    // McBSP-B register settings
    SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; // Enable low speed clk to McBSP-B

    McbspbRegs.SPCR2.all=0x0000;		// Reset FS generator, sample rate generator & transmitter
	McbspbRegs.SPCR1.all=0x0000;		// Reset Receiver, Right justify word
	McbspbRegs.SPCR1.bit.DLB = 0;       // Enable loopback mode for test. Comment out for normal McBSP transfer mode.

	McbspbRegs.MFFINT.all=0x0;			// Disable all interrupts

    McbspbRegs.RCR2.all=0x0;			// Single-phase frame, 1 word/frame, No companding	(Receive)
    McbspbRegs.RCR1.all=0x0;

    McbspbRegs.XCR2.all=0x0;			// Single-phase frame, 1 word/frame, No companding	(Transmit)
    McbspbRegs.XCR1.all=0x0;

    McbspbRegs.SPCR1.bit.CLKSTP = 3; // Clock Stop Mode: Together with CLKXP/CLKRP determines clocking scheme
    McbspbRegs.PCR.bit.CLKXP = 0;    // CLKX Send Polarity: CPOL = 1, CPHA = 0 rising edge no delay
    McbspbRegs.PCR.bit.CLKRP = 0;    // MCLKX Receive Polarity: CPOL = 0, CPHA = 0 rising edge no delay

    //Receiver config
    McbspbRegs.RCR2.bit.RFIG=0;         // Receive  frame sync ignore
    McbspbRegs.RCR2.bit.RCOMPAND=0;     // Receive  Companding Mode selects
    McbspbRegs.RCR2.bit.RPHASE=0;       // Receive Phase
    McbspbRegs.XCR2.bit.XPHASE=0;       // Transmit Phase

    McbspbRegs.XCR2.bit.XDATDLY=01;     // Transmit data delay bits.  1: 1-bit data delay
    McbspbRegs.RCR2.bit.RDATDLY=01;     // Receive data delay bits.   1: 1-bit data delay

    InitMcbspb32bit();                  // 7:5    Receive and Send  word length

    McbspbRegs.RCR1.bit.RFRLEN1=0;      // In SPI mode must be 0. Number of words per phase 1
    McbspbRegs.XCR1.bit.XFRLEN1=0;      // In SPI mode must be 0. Number of words per phase 1

    // CLK config
    McbspbRegs.SRGR2.bit.CLKSM = 1;		// CLKSM=1 (If SCLKME=0, i/p clock to SRG is LSPCLK)
	McbspbRegs.SRGR2.bit.FPER = 1;		// FPER = 1 CLKG periods
	McbspbRegs.SRGR2.bit.FSGM = 0;
    McbspbRegs.SRGR1.bit.FWID = 1;              // Frame Width = 1 CLKG period
    McbspbRegs.SRGR1.bit.CLKGDV = CLKGDV_VAL;	// CLKGDV_VAL=16 CLKG frequency = LSPCLK/(CLKGDV+1)

    McbspbRegs.PCR.bit.SCLKME = 0;      // Sample rate generator input clock mode bit
   	McbspbRegs.PCR.bit.FSXM = 1;		// Transmit Frame Synchronization Mode
   	McbspbRegs.PCR.bit.FSRM = 1;        // Receive Frame Synchronization Mode
   	McbspbRegs.PCR.bit.CLKXM = 1;		// CLKX generated internally, CLKR derived from an external source
	McbspbRegs.PCR.bit.CLKRM = 1;       // Receiver clock mode CLKRM=1
	McbspbRegs.PCR.bit.FSXP = 1;        // Transmit Frame synchronization polarity FSXP = 1
	McbspbRegs.PCR.bit.FSRP = 0;        // Receive Frame synchronization polarity FSRP = 1

	delay_loop();                // Wait at least 2 SRG clock cycles
    McbspbRegs.SPCR2.bit.GRST=1; // Enable the sample rate generator
	clkg_delay_loop();           // Wait at least 2 CLKG cycles
	McbspbRegs.SPCR2.bit.XRST=1; // Release TX from Reset
	McbspbRegs.SPCR1.bit.RRST=1; // Release RX from Reset
    McbspbRegs.SPCR2.bit.FRST=1; // Frame Sync Generator reset
}

The GPIO pins (24, 25, 26 and 27) are also configured to work as McBSP mode and I transfer the data as:

void MCBSP_B_TransferData(uint16_t *SpiTxData, uint16_t *SpiRxData)
{
    // Transmit 31 - 0 bit data
    while(McbspbRegs.SPCR2.bit.XRDY == 0) {}

           McbspbRegs.DXR2.all= SpiTxData[1];          // 31-16

           McbspbRegs.DXR1.all= SpiTxData[0];          // 15-0

    // Receive 31 - 0 bit data
    while(McbspbRegs.SPCR1.bit.RRDY == 0) {}

        SpiRxData[1]= McbspbRegs.DRR2.all;             // 31-16

        SpiRxData[0]= McbspbRegs.DRR1.all;             // 15-0

}

Maybe is something I have configuring wrong in the reception? Is it possible that the content of DRR2 (0xFFFF) is also buffered into DRR1?

Thank you in advance for the support!

JC

  • JC,

    Apologies for the delay here, since we know that the CAN device is receiving data from the C2000 correctly, I'd like to focus on the receive aspect of the comms.

    Can you change line 20 to make the receive clock negative polarity?  Since transmit clock is rising edge, I think receive should be falling edge.

     McbspbRegs.PCR.bit.CLKRP = 1;   

    Best,

    Matthew

  • Hi Matthew,

    I have just tried and nothing, same result.

    Regards,

    JC

  • JC,

    For the GPIOs that are configured as McBSP, please look at the Qualification mode/register for each and set this to ASYNC.  Since the McBSP is generating its own clock there is not a need to synchronize the incoming signal to the CPU clock, and this might add extra delay we don't want.  The default value of 0, will sync these to the CPU clock before latching the signal.

    Best,
    Matthew

  • Yes, you mean this code snippet from function InitMcbspbGpio() rigth?

        GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3;   // Asynch input GPIO25 (MDRB) (Comment as needed)
        GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3;   // Asynch input GPIO26(MCLKXB) (Comment as needed)
        GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 3;    // Asynch input GPIO3 (MCLKRB) (Comment as needed)
        GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3;   // Asynch input GPIO27 (MFSXB) (Comment as needed)
    	GpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 3;    // Asynch input GPIO1 (MFSRB) (Comment as needed)
    

    I have configured this way.

  • We have done some trial, configuring GPIO25 as GPIO and not as MDRB to check if the pin was receiving something. An interrupt was enabled each time there was a falling edge on that pin and it was receiving the correct data (not 0xFFFF), there were 3 falling edges in the counter as is shown on the oscilloscope image above so is receiving.

    So the problem seems to bebe on the reception from DR pin to DRR buffer, right?

  • Hello JC,

    Matthew is currently out of the office, but he will return Monday to answer your question.

    Best regards,

    Omer Amir

  • Okay Omer, thank you!

    I am trying to send the same info but instead of sending 32 bits I am controlling the CS signal and sending now 8 bits 4 times and the CAN device is still answering as we can see on the oscilloscope, but again, not in the DRR1 register:

    But now, as InitMcbspb8bit(); has been set, we only se 0x00FF in DRR register. it seems that the DRR takes the size of the word length will all those bits to 1.

    The difference between this configuration and the one before is CLKRP = 1, and InitMcbspb8bit() but I paste it here again just in case...

    void InitMcbspb(void)
    {
        // McBSP-B register settings
        SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; // Enable low speed clk to McBSP-B
    
        McbspbRegs.SPCR2.all=0x0000;		// Reset FS generator, sample rate generator & transmitter
    	McbspbRegs.SPCR1.all=0x0000;		// Reset Receiver, Right justify word
    	McbspbRegs.PCR.all=0x0000;          // All to 0
    
    	McbspbRegs.SPCR1.bit.DLB = 0;       // Enable loopback mode for test. Comment out for normal McBSP transfer mode.
    	McbspbRegs.SPCR1.bit.RJUST = 0;
    
    	McbspbRegs.MFFINT.all=0x0;			// Disable all interrupts
    
        McbspbRegs.RCR2.all=0x0;			// Single-phase frame, 1 word/frame, No companding	(Receive)
        McbspbRegs.RCR1.all=0x0;
    
        McbspbRegs.XCR2.all=0x0;			// Single-phase frame, 1 word/frame, No companding	(Transmit)
        McbspbRegs.XCR1.all=0x0;
    
        McbspbRegs.SPCR1.bit.CLKSTP = 3; // Clock Stop Mode: Together with CLKXP/CLKRP determines clocking scheme
        McbspbRegs.PCR.bit.CLKXP = 0;    // CLKX Send Polarity: CPOL = 1, CPHA = 0 rising edge no delay
        McbspbRegs.PCR.bit.CLKRP = 1;    // MCLKX Receive Polarity: CPOL = 0, CPHA = 0 rising edge no delay
    
        //Receiver config
        McbspbRegs.RCR2.bit.RFIG=0;         // Receive  frame sync ignore
        McbspbRegs.RCR2.bit.RCOMPAND=0;     // Receive  Companding Mode selects
        McbspbRegs.RCR2.bit.RPHASE=0;       // Receive Phase
        McbspbRegs.XCR2.bit.XPHASE=0;       // Transmit Phase
    
        McbspbRegs.XCR2.bit.XDATDLY=01;     // Transmit data delay bits.  1: 1-bit data delay
        McbspbRegs.RCR2.bit.RDATDLY=01;     // Receive data delay bits.   1: 1-bit data delay
    
        InitMcbspb8bit();                  // 7:5    Receive and Send  word length
    
        McbspbRegs.RCR1.bit.RFRLEN1=0;      // In SPI mode must be 0. Number of words per phase 1
        McbspbRegs.XCR1.bit.XFRLEN1=0;      // In SPI mode must be 0. Number of words per phase 1
    
        // CLK config
        McbspbRegs.SRGR2.bit.CLKSM = 1;		// CLKSM=1 (If SCLKME=0, i/p clock to SRG is LSPCLK)
    	McbspbRegs.SRGR2.bit.FPER = 1;		// FPER = 1 CLKG periods
    	McbspbRegs.SRGR2.bit.FSGM = 0;
    	McbspbRegs.SRGR2.bit.GSYNC = 0;
        McbspbRegs.SRGR1.bit.FWID = 1;              // Frame Width = 1 CLKG period
        McbspbRegs.SRGR1.bit.CLKGDV = CLKGDV_VAL;	// CLKGDV_VAL=16 CLKG frequency = LSPCLK/(CLKGDV+1)
    
        McbspbRegs.PCR.bit.SCLKME = 0;      // Sample rate generator input clock mode bit
       	McbspbRegs.PCR.bit.FSXM = 1;		// Transmit Frame Synchronization Mode
       	McbspbRegs.PCR.bit.FSRM = 1;        // Receive Frame Synchronization Mode
       	McbspbRegs.PCR.bit.CLKXM = 1;		// CLKX generated internally, CLKR derived from an external source
    	McbspbRegs.PCR.bit.CLKRM = 1;       // Receiver clock mode CLKRM=1
    	McbspbRegs.PCR.bit.FSXP = 1;        // Transmit Frame synchronization polarity FSXP = 1
    	McbspbRegs.PCR.bit.FSRP = 0;        // Receive Frame synchronization polarity FSRP = 1
    
    	delay_loop();                // Wait at least 2 SRG clock cycles
        McbspbRegs.SPCR2.bit.GRST=1; // Enable the sample rate generator
    	clkg_delay_loop();           // Wait at least 2 CLKG cycles
    	McbspbRegs.SPCR2.bit.XRST=1; // Release TX from Reset
        McbspbRegs.SPCR1.bit.RRST=1; // Release RX from Reset
        McbspbRegs.SPCR2.bit.FRST=1; // Frame Sync Generator reset
    }

    Thank you for the support,

    JC

  • Hi JC,

    Thank you for doing further checks and confirming there is data being received on the pin. 

    Would it be possible to see the rest of code, mainly how you are transmitting and receiving the 8-bits (four times)?

    Best Regards,

    Marlyn

  • Hi Marlyn, I think that some other previous initialization (InitGpio();) is affecting on the reception. I have this other gpio initialization before mine and I am getting some weird behaviour. Attached code:

    void InitGpio(void)
    {
       EALLOW;
       // Each GPIO pin can be:
       // a) a GPIO input/output
       // b) peripheral function 1
       // c) peripheral function 2
       // d) peripheral function 3
       // By default, all are GPIO Inputs
       /*
       GpioCtrlRegs.GPAMUX1.all = 0x0000;     // GPIO functionality GPIO0-GPIO15
       GpioCtrlRegs.GPAMUX2.all = 0x0000;     // GPIO functionality GPIO16-GPIO31
       GpioCtrlRegs.GPBMUX1.all = 0x0000;     // GPIO functionality GPIO32-GPIO39
       GpioCtrlRegs.GPBMUX2.all = 0x0000;     // GPIO functionality GPIO48-GPIO63
       GpioCtrlRegs.GPCMUX1.all = 0x0000;     // GPIO functionality GPIO64-GPIO79
       GpioCtrlRegs.GPCMUX2.all = 0x0000;     // GPIO functionality GPIO80-GPIO95
    
       GpioCtrlRegs.GPADIR.all = 0x0000;      // GPIO0-GPIO31 are inputs
       GpioCtrlRegs.GPBDIR.all = 0x0000;      // GPIO32-GPIO63 are inputs
       GpioCtrlRegs.GPCDIR.all = 0x0000;      // GPI064-GPIO95 are inputs
       */
    
       // Each input can have different qualification
       // a) input synchronized to SYSCLKOUT
       // b) input qualified by a sampling window
       // c) input sent asynchronously (valid for peripheral inputs only)
       GpioCtrlRegs.GPAQSEL1.all = 0x0000;    // GPIO0-GPIO15 Synch to SYSCLKOUT
       GpioCtrlRegs.GPAQSEL2.all = 0x0000;    // GPIO16-GPIO31 Synch to SYSCLKOUT
       GpioCtrlRegs.GPBQSEL1.all = 0x0000;    // GPIO32-GPIO39 Synch to SYSCLKOUT
       GpioCtrlRegs.GPBQSEL2.all = 0x0000;    // GPIO48-GPIO63 Synch to SYSCLKOUT
    
       // Pull-ups can be enabled or disabled.
       GpioCtrlRegs.GPAPUD.all = 0x0000;      // Pullup's enabled GPIO0-GPIO31
       GpioCtrlRegs.GPBPUD.all = 0x0000;      // Pullup's enabled GPIO32-GPIO63
       GpioCtrlRegs.GPCPUD.all = 0x0000;      // Pullup's enabled GPIO64-GPIO79
    
       //GpioCtrlRegs.GPAPUD.all = 0xFFFF;    // Pullup's disabled GPIO0-GPIO31
       //GpioCtrlRegs.GPBPUD.all = 0xFFFF;    // Pullup's disabled GPIO32-GPIO34
       //GpioCtrlRegs.GPCPUD.all = 0xFFFF     // Pullup's disabled GPIO64-GPIO79
    
    
       //--- Group A pins
    
    	GpioCtrlRegs.GPACTRL.all  = 0x00000000;		// QUALPRD = SYSCLKOUT for all group A GPIO
    	GpioCtrlRegs.GPAQSEL1.all = 0x00000000;		// No qualification for all group A GPIO 0-15
    	GpioCtrlRegs.GPAQSEL2.all = 0x00000000;		// No qualification for all group A GPIO 16-31
    	GpioCtrlRegs.GPADIR.all   = 0x00000000;		// All group A GPIO are inputs
    	GpioCtrlRegs.GPAPUD.all   = 0x00000FFF;		// Pullups enabled GPIO31-12, disabled GPIO11-0
    
      /*GpioCtrlRegs.GPAMUX1.bit.GPIO1  = 1;        // 0=GPIO  1=EPWM1B     2=ECAP6      3=rsvd
        GpioCtrlRegs.GPAMUX1.bit.GPIO3  = 1;        // 0=GPIO  1=EPWM2B     2=ECAP5      3=rsvd
        GpioCtrlRegs.GPAMUX1.bit.GPIO0  = 1;		// 0=GPIO  1=EPWM1A     2=rsvd       3=rsvd
    	GpioCtrlRegs.GPAMUX1.bit.GPIO2  = 1;		// 0=GPIO  1=EPWM2A     2=rsvd       3=rsvd
    	GpioCtrlRegs.GPAMUX1.bit.GPIO4  = 1;		// 0=GPIO  1=EPWM3A     2=rsvd       3=rsvd
    	GpioCtrlRegs.GPAMUX1.bit.GPIO5  = 1;		// 0=GPIO  1=EPWM3B     2=MFSRA      3=ECAP1
      */
      //PWM ventilacion
    	GpioCtrlRegs.GPAMUX1.bit.GPIO6  = 1;		// 0=GPIO  1=EPWM4A     2=EPWMSYNCI  3=EPWMSYNCO
    	GpioCtrlRegs.GPAMUX1.bit.GPIO7  = 1;		// 0=GPIO  1=EPWM4B     2=MCLKRA     3=ECAP2
    	GpioCtrlRegs.GPAMUX1.bit.GPIO8  = 1;		// 0=GPIO  1=EPWM5A     2=CANTXB     3=ADCSOCAO
      /*
    	GpioCtrlRegs.GPAMUX1.bit.GPIO9  = 1;		// 0=GPIO  1=EPWM5B     2=SCITXDB    3=ECAP3
    	GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 1;		// 0=GPIO  1=EPWM6A     2=CANRXB     3=ADCSOCBO
    	GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 1;		// 0=GPIO  1=EPWM6B     2=SCIRXDB    3=ECAP4
      */
    
    
    	//Can B
    	GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 3;		// 0=GPIO  1=TZ1        2=CANTXB     3=SPISIMOB
    	GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 3;		// 0=GPIO  1=TZ2        2=CANRXB     3=SPISOMIB
    
    	GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;		// 0=GPIO  1=TZ3/XHOLD  2=SCITXDB    3=SPICLKB
    	GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0;		// 0=GPIO  1=TZ4/XHOLDA 2=SCIRXDB    3=SPISTEB
    
    	GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0;		// 0=GPIO  1=SPISIMOA   2=CANTXB     3=TZ5
    	GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0;		// 0=GPIO  1=SPISOMIA   2=CANRXB     3=TZ6
    
    	//Can a
    	GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 3;		// 0=GPIO  1=SPICLKA    2=SCITXDB    3=CANRXA
    	GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 3;		// 0=GPIO  1=SPISTEA    2=SCIRXDB    3=CANTXA
    
    	GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 0;		// 0=GPIO  1=EQEP1A     2=MDXA       3=CANTXB
    	GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 0;		// 0=GPIO  1=EQEP1B     2=MDRA       3=CANRXB
    
    
      //Estos dos luego los vamos a poner como uart
    	GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0;		// 0=GPIO  1=EQEP1S     2=MCLKXA     3=SCITXDB
    	GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0;		// 0=GPIO  1=EQEP1I     2=MFSXA      3=SCIRXDB
    
    	GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 3;		// 0=GPIO  1=ECAP1      2=EQEP2A     3=MDXB
    	GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 3;		// 0=GPIO  1=ECAP2      2=EQEP2B     3=MDRB
    	GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 3;		// 0=GPIO  1=ECAP3      2=EQEP2I     3=MCLKXB
    	GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 0;		// 0=GPIO  1=ECAP4      2=EQEP2S     3=MFSXB
    	GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 3;		// 0=GPIO  1=SCIRXDA    2=XZCS6      3=XZCS6
    	GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 0;		// 0=GPIO  1=SCITXDA    2=XA19       3=XA19
    	GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 0;		// 0=GPIO  1=CANRXA     2=XA18       3=XA18
    	GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 3;		// 0=GPIO  1=CANTXA     2=XA17       3=XA17
    
    //--- Group B pins
    	GpioCtrlRegs.GPBCTRL.all  = 0x00000000;		// QUALPRD = SYSCLKOUT for all group B GPIO
    	GpioCtrlRegs.GPBQSEL1.all = 0x00000000;		// No qualification for all group B GPIO 32-47
    	GpioCtrlRegs.GPBQSEL2.all = 0x00000000;		// No qualification for all group B GPIO 48-63
    	GpioCtrlRegs.GPBDIR.all   = 0x00000000;		// All group B GPIO are inputs
    	GpioCtrlRegs.GPBPUD.all   = 0x00000000;		// All group B pullups enabled
    
      /*
    	GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;		// 0=GPIO  1=SDAA      2=EPWMSYNCI  3=ADCSOCAO
    	GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 0;		// 0=GPIO  1=SCLA      2=EPWMSYNCO  3=ADCSOCBO
    	GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;		// 0=GPIO  1=ECAP1     2=XREADY     3=XREADY
    	GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 3;		// 0=GPIO  1=SCITXDA   2=XR/W       3=XR/W
    	GpioCtrlRegs.GPBMUX1.bit.GPIO36 = 3;		// 0=GPIO  1=SCIRXDA   2=XZCS0      3=XZCS0
    	GpioCtrlRegs.GPBMUX1.bit.GPIO37 = 3;		// 0=GPIO  1=ECAP2     2=XZCS7      3=XZCS7
    	GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 3;		// 0=GPIO  1=rsvd      2=XWE0       3=XWE0
    	GpioCtrlRegs.GPBMUX1.bit.GPIO39 = 0;		// 0=GPIO  1=rsvd      2=XA16       3=XA16
    	GpioCtrlRegs.GPBMUX1.bit.GPIO40 = 3;		// 0=GPIO  1=rsvd      2=XA0/XWE1   3=XA0/XWE1
    	GpioCtrlRegs.GPBMUX1.bit.GPIO41 = 3;		// 0=GPIO  1=rsvd      2=XA1        3=XA1
    	GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 3;		// 0=GPIO  1=rsvd      2=XA2        3=XA2
    	GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 3;		// 0=GPIO  1=rsvd      2=XA3        3=XA3
    	GpioCtrlRegs.GPBMUX1.bit.GPIO44 = 3;		// 0=GPIO  1=rsvd      2=XA4        3=XA4
    	GpioCtrlRegs.GPBMUX1.bit.GPIO45 = 3;		// 0=GPIO  1=rsvd      2=XA5        3=XA5
    	GpioCtrlRegs.GPBMUX1.bit.GPIO46 = 3;		// 0=GPIO  1=rsvd      2=XA6        3=XA6
    	GpioCtrlRegs.GPBMUX1.bit.GPIO47 = 3;		// 0=GPIO  1=rsvd      2=XA7        3=XA7
      */
    
    	GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 0;		// 0=GPIO  1=ECAP5     2=XD31       3=XD31
    	GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 0;		// 0=GPIO  1=ECAP6     2=XD30       3=XD30
    	GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0;		// 0=GPIO  1=EQEP1A    2=XD29       3=XD29
    	GpioCtrlRegs.GPBMUX2.bit.GPIO51 = 0;		// 0=GPIO  1=EQEP1B    2=XD28       3=XD28
    	GpioCtrlRegs.GPBMUX2.bit.GPIO52 = 0;		// 0=GPIO  1=EQEP1S    2=XD27       3=XD27
    	GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 0;		// 0=GPIO  1=EQEP1I    2=XD26       3=XD26
    	GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1;		// 0=GPIO  1=SPISIMOA  2=XD25       3=XD25
    	GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1;		// 0=GPIO  1=SPISOMIA  2=XD24       3=XD24
    	GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1;		// 0=GPIO  1=SPICLKA   2=XD23       3=XD23
    	GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 0;		// 0=GPIO  1=SPISTEA   2=XD22       3=XD22
    	GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 0;		// 0=GPIO  1=MCLKRA    2=XD21       3=XD21
    	GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 0;		// 0=GPIO  1=MFSRA     2=XD20       3=XD20
    	GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0;		// 0=GPIO  1=MCLKRB    2=XD19       3=XD19
    	GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0;		// 0=GPIO  1=MFSRB     2=XD18       3=XD18
      //Estos dos luego los vamos a poner como uart.
    	GpioCtrlRegs.GPBMUX2.bit.GPIO62 = 0;		// 0=GPIO  1=SCIRXDC   2=XD17       3=XD17
    	GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 0;		// 0=GPIO  1=SCITXDC   2=XD16       3=XD16
    
    //--- Group C pins
    	GpioCtrlRegs.GPCDIR.all = 0x00000000;		// All group C GPIO are inputs
    	GpioCtrlRegs.GPCPUD.all = 0x00000000;		// All group C pullups enabled
    
    	GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 3;		// 0=GPIO  1=GPIO      2=XD15       3=XD15
    	GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 3;		// 0=GPIO  1=GPIO      2=XD14       3=XD14
    	GpioCtrlRegs.GPCMUX1.bit.GPIO66 = 3;		// 0=GPIO  1=GPIO      2=XD13       3=XD13
    	GpioCtrlRegs.GPCMUX1.bit.GPIO67 = 3;		// 0=GPIO  1=GPIO      2=XD12       3=XD12
    	GpioCtrlRegs.GPCMUX1.bit.GPIO68 = 3;		// 0=GPIO  1=GPIO      2=XD11       3=XD11
    	GpioCtrlRegs.GPCMUX1.bit.GPIO69 = 3;		// 0=GPIO  1=GPIO      2=XD10       3=XD10
    	GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 3;		// 0=GPIO  1=GPIO      2=XD9        3=XD9
    	GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 3;		// 0=GPIO  1=GPIO      2=XD8        3=XD8
    	GpioCtrlRegs.GPCMUX1.bit.GPIO72 = 3;		// 0=GPIO  1=GPIO      2=XD7        3=XD7
    	GpioCtrlRegs.GPCMUX1.bit.GPIO73 = 3;		// 0=GPIO  1=GPIO      2=XD6        3=XD6
    	GpioCtrlRegs.GPCMUX1.bit.GPIO74 = 3;		// 0=GPIO  1=GPIO      2=XD5        3=XD5
    	GpioCtrlRegs.GPCMUX1.bit.GPIO75 = 3;		// 0=GPIO  1=GPIO      2=XD4        3=XD4
    	GpioCtrlRegs.GPCMUX1.bit.GPIO76 = 3;		// 0=GPIO  1=GPIO      2=XD3        3=XD3
    	GpioCtrlRegs.GPCMUX1.bit.GPIO77 = 3;		// 0=GPIO  1=GPIO      2=XD2        3=XD2
    	GpioCtrlRegs.GPCMUX1.bit.GPIO78 = 3;		// 0=GPIO  1=GPIO      2=XD1        3=XD1
    	GpioCtrlRegs.GPCMUX1.bit.GPIO79 = 3;		// 0=GPIO  1=GPIO      2=XD0        3=XD0
    
    	GpioCtrlRegs.GPCMUX2.bit.GPIO80 = 3;		// 0=GPIO  1=GPIO      2=XA8        3=XA8
    	GpioCtrlRegs.GPCMUX2.bit.GPIO81 = 3;		// 0=GPIO  1=GPIO      2=XA9        3=XA9
    	GpioCtrlRegs.GPCMUX2.bit.GPIO82 = 3;		// 0=GPIO  1=GPIO      2=XA10       3=XA10
    	GpioCtrlRegs.GPCMUX2.bit.GPIO83 = 3;		// 0=GPIO  1=GPIO      2=XA11       3=XA11
    	GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 3;		// 0=GPIO  1=GPIO      2=XA12       3=XA12
    	GpioCtrlRegs.GPCMUX2.bit.GPIO85 = 3;		// 0=GPIO  1=GPIO      2=XA13       3=XA13
    	GpioCtrlRegs.GPCMUX2.bit.GPIO86 = 3;		// 0=GPIO  1=GPIO      2=XA14       3=XA14
    	GpioCtrlRegs.GPCMUX2.bit.GPIO87 = 3;		// 0=GPIO  1=GPIO      2=XA15       3=XA15
    
    //--- External interrupt selection
    	GpioIntRegs.GPIOXINT1SEL.all = 0x0019;		// GPIO0 is XINT1 source
    	GpioIntRegs.GPIOXINT2SEL.all = 0x0000;		// GPIO0 is XINT2 source
    	GpioIntRegs.GPIOXINT3SEL.all = 0x0000;		// GPIO32 is XINT3 source
    	GpioIntRegs.GPIOXINT4SEL.all = 0x0000;		// GPIO32 is XINT4 source
    	GpioIntRegs.GPIOXINT5SEL.all = 0x0000;		// GPIO32 is XINT5 source
    	GpioIntRegs.GPIOXINT6SEL.all = 0x0000;		// GPIO32 is XINT6 source
    	GpioIntRegs.GPIOXINT7SEL.all = 0x0000;		// GPIO32 is XINT7 source
    	GpioIntRegs.GPIOXNMISEL.all = 0x0000;		// GPIO0 is XNMI source
    
    	XIntruptRegs.XINT1CR.all = 0x0005;			// XINT1 disabled
    	XIntruptRegs.XINT2CR.all = 0x0000;			// XINT2 disabled
    	XIntruptRegs.XINT3CR.all = 0x0000;			// XINT3 disabled
    	XIntruptRegs.XINT4CR.all = 0x0000;			// XINT4 disabled
    	XIntruptRegs.XINT5CR.all = 0x0000;			// XINT5 disabled
    	XIntruptRegs.XINT6CR.all = 0x0000;			// XINT6 disabled
    	XIntruptRegs.XINT7CR.all = 0x0000;			// XINT7 disabled
    	XIntruptRegs.XNMICR.all = 0x0000;			// XNMI disabled
    
    
    //--- Low-power mode selection
    	 GpioIntRegs.GPIOLPMSEL.all = 0x00000000;	// No pin selected for HALT and STANBY wakeup (reset default)
    
    
       GpioCtrlRegs.GPADIR.bit.GPIO20 = 1;   //EEPROM chip select
       GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;	 //GPIO34 set to output. TX/RX of 485
    
       GpioCtrlRegs.GPBDIR.bit.GPIO57 = 1;	 //LED0
       GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1;	 //WDI
       GpioCtrlRegs.GPBDIR.bit.GPIO48 = 1;	 //LED1
       GpioCtrlRegs.GPADIR.bit.GPIO27 = 1;	 //FR1 Output for Slave Select
       GpioCtrlRegs.GPADIR.bit.GPIO26 = 1;	 //FR0
       GpioCtrlRegs.GPADIR.bit.GPIO25 = 0;	 //RELE_AC_7
       GpioCtrlRegs.GPADIR.bit.GPIO24 = 1;	 //RELE_AC_6
       GpioCtrlRegs.GPADIR.bit.GPIO17 = 1;	 //RELE_AC_5
       GpioCtrlRegs.GPADIR.bit.GPIO16 = 1;	 //RELE_AC_4
       GpioCtrlRegs.GPADIR.bit.GPIO15 = 1;	 //RELE_AC_3
       GpioCtrlRegs.GPADIR.bit.GPIO14 = 1;	 //RELE_AC_2
       GpioCtrlRegs.GPBDIR.bit.GPIO33 = 1;	 //RELE_AC_1
       GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1;	 //RELE_AC_0
    
       GpioCtrlRegs.GPADIR.bit.GPIO10 = 1;
       GpioCtrlRegs.GPADIR.bit.GPIO9 = 1;
       GpioCtrlRegs.GPADIR.bit.GPIO5 = 1;
       GpioCtrlRegs.GPADIR.bit.GPIO4 = 1;
       GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;
       GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;
       GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
       GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
       
       EDIS;
    
    }	

    The thing is that if I comment the EALLOW and EDIS of the previous initialization y get the correct answer (what I see in the oscilloscope) on the DRR1 register (0x0003) but if i dont comment it I get 0x00FF.

    Do you know what is happening here? Is it possible that the EALLOW or EDIS commands are affecting?

    Regards,

    JC

  • JC,

    The odd thing here is that commenting out the EALLOW/EDIS will prevent most/all of those register writes in between from going through.  This would imply that there could be another place where the GPIOs are configured?  Another item of note is that in this code it appears that we are setting the qualification mode for all the IOs to their default "0" state, which is synchronized to the SYSCLK.  In the case of the McBSP we actually want no qual applied(value of 3 for each IO that is McBSP) since it has its own sync internally.

    Any chance there is another init somewhere in the code that is getting over-written by this one(when you don't have the EALLOW/EDIS commented out)

    Best,

    Matthew