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.
Hello,
I am trying to write a very basic program to test communication between two DSP's using SCI.
I am connecting pin no 3 of EZdsp1 to Pin no 4 of EZdsp 2 and Pin no 3 of EZdsp 2 to pin no 4 of Ez dsp1. all from port 8 for both the EZdsp kits.
for transmitter i am using this code
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File // Prototype statements for functions found within this file. void scia_loopback_init(void); void scia_fifo_init(void); void scia_xmit(int a); void error(); interrupt void scia_rx_isr(void); interrupt void scia_tx_isr(void); // Global counts used in this example Uint16 LoopCount; Uint16 ErrorCount; void main(void) { Uint16 SendChar; Uint16 ReceivedChar; // Step 1. Initialize System Control registers, PLL, WatchDog, Clocks to default state: // This function is found in the DSP2833x_SysCtrl.c file. InitSysCtrl(); // Step 2. Select GPIO for the device or for the specific application: // This function is found in the DSP2833x_Gpio.c file. // InitGpio(); skip this as this is example selects the I/O // for SCI-A in this file itself InitSciGpio(); // Step 3. Initialize PIE vector table: // The PIE vector table is initialized with pointers to shell Interrupt // Service Routines (ISR). The shell routines are found in DSP2833x_DefaultIsr.c. // Insert user specific ISR code in the appropriate shell ISR routine in // the DSP28_DefaultIsr.c file. // Disable and clear all CPU interrupts: DINT; IER = 0x0000; IFR = 0x0000; // Initialize Pie Control Registers To Default State: // This function is found in the DSP2833x_PieCtrl.c file. // InitPieCtrl(); PIE is not used for this example // Initialize the PIE Vector Table To a Known State: // This function is found in DSP2833x_PieVect.c. // This function populates the PIE vector table with pointers // to the shell ISR functions found in DSP2833x_DefaultIsr.c. InitPieVectTable(); // Enable CPU and PIE interrupts // This example function is found in the DSP2833x_PieCtrl.c file. EnableInterrupts(); // Step 4. Initialize all the Device Peripherals to a known state: // This function is found in DSP2833x_InitPeripherals.c // InitPeripherals(); skip this for SCI tests // Step 5. User specific functions, Reassign vectors (optional), Enable Interrupts: LoopCount = 0; ErrorCount = 0; scia_fifo_init(); // Initialize the SCI FIFO scia_loopback_init(); // Initalize SCI for digital loop back // Note: Autobaud lock is not required for this example // Send a character starting with 0 SendChar = 10; // Step 6. Send Characters forever starting with 0x00 and going through // 0xFF. After sending each, check the recieve buffer for the correct value for(;;) { scia_xmit(SendChar); while(SciaRegs.SCIFFRX.bit.RXFFST !=1) { } // wait for RRDY/RXFFST =1 for 1 data available in FIFO // Check received character ReceivedChar = ScibRegs.SCIRXBUF.all; if(ReceivedChar != SendChar) error(); // Move to the next character and repeat the test SendChar++; // Limit the character to 8-bits SendChar &= 0x00FF; LoopCount++; } } // Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here: void error() { ErrorCount++; // asm(" ESTOP0"); // Uncomment to stop the test here // for (;;); } // Test 1,SCIA DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity void scia_loopback_init() { // Note: Clocks were turned on to the SCIA peripheral // in the InitSysCtrl() function SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback // No parity,8 char bits, // async mode, idle-line protocol SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK, // Disable RX ERR, SLEEP, TXWAKE SciaRegs.SCICTL2.all =0x0003; SciaRegs.SCICTL2.bit.TXINTENA =1; SciaRegs.SCICTL2.bit.RXBKINTENA =1; SciaRegs.SCIHBAUD =0x0000; SciaRegs.SCILBAUD =0x000F; // SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset } // Transmit a character from the SCI' void scia_xmit(int a) { SciaRegs.SCITXBUF=a; } // Initalize the SCI FIFO void scia_fifo_init() { SciaRegs.SCIFFTX.all=0xE040; SciaRegs.SCIFFRX.all=0x204f; SciaRegs.SCIFFCT.all=0x0; }
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File // Prototype statements for functions found within this file. void scia_loopback_init(void); void scia_fifo_init(void); void scia_xmit(int a); void error(); interrupt void scia_rx_isr(void); interrupt void scia_tx_isr(void); // Global counts used in this example Uint16 LoopCount; Uint16 ErrorCount; void main(void) { Uint16 SendChar; Uint16 ReceivedChar; // Step 1. Initialize System Control registers, PLL, WatchDog, Clocks to default state: // This function is found in the DSP2833x_SysCtrl.c file. InitSysCtrl(); // Step 2. Select GPIO for the device or for the specific application: // This function is found in the DSP2833x_Gpio.c file. // InitGpio(); skip this as this is example selects the I/O // for SCI-A in this file itself InitSciGpio(); // Step 3. Initialize PIE vector table: // The PIE vector table is initialized with pointers to shell Interrupt // Service Routines (ISR). The shell routines are found in DSP2833x_DefaultIsr.c. // Insert user specific ISR code in the appropriate shell ISR routine in // the DSP28_DefaultIsr.c file. // Disable and clear all CPU interrupts: DINT; IER = 0x0000; IFR = 0x0000; // Initialize Pie Control Registers To Default State: // This function is found in the DSP2833x_PieCtrl.c file. // InitPieCtrl(); PIE is not used for this example // Initialize the PIE Vector Table To a Known State: // This function is found in DSP2833x_PieVect.c. // This function populates the PIE vector table with pointers // to the shell ISR functions found in DSP2833x_DefaultIsr.c. InitPieVectTable(); // Enable CPU and PIE interrupts // This example function is found in the DSP2833x_PieCtrl.c file. EnableInterrupts(); // Step 4. Initialize all the Device Peripherals to a known state: // This function is found in DSP2833x_InitPeripherals.c // InitPeripherals(); skip this for SCI tests // Step 5. User specific functions, Reassign vectors (optional), Enable Interrupts: LoopCount = 0; ErrorCount = 0; scia_fifo_init(); // Initialize the SCI FIFO scia_loopback_init(); // Initalize SCI for digital loop back // Note: Autobaud lock is not required for this example // Send a character starting with 0 SendChar = 10; // Step 6. Send Characters forever starting with 0x00 and going through // 0xFF. After sending each, check the recieve buffer for the correct value for(;;) { while(SciaRegs.SCIFFRX.bit.RXFFST !=1) { } // wait for RRDY/RXFFST =1 for 1 data available in FIFO // Check received character ReceivedChar = ScibRegs.SCIRXBUF.all; scia_xmit(ReceivedChar); } } // Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here: void error() { ErrorCount++; // asm(" ESTOP0"); // Uncomment to stop the test here // for (;;); } // Test 1,SCIA DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity void scia_loopback_init() { // Note: Clocks were turned on to the SCIA peripheral // in the InitSysCtrl() function SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback // No parity,8 char bits, // async mode, idle-line protocol SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK, // Disable RX ERR, SLEEP, TXWAKE SciaRegs.SCICTL2.all =0x0003; SciaRegs.SCICTL2.bit.TXINTENA =1; SciaRegs.SCICTL2.bit.RXBKINTENA =1; SciaRegs.SCIHBAUD =0x0000; SciaRegs.SCILBAUD =0x000F; // SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset } // Transmit a character from the SCI' void scia_xmit(int a) { SciaRegs.SCITXBUF=a; } // Initalize the SCI FIFO void scia_fifo_init() { SciaRegs.SCIFFTX.all=0xE040; SciaRegs.SCIFFRX.all=0x204f; SciaRegs.SCIFFCT.all=0x0; }
Am i doing something wrong with the code or the hardware connection?
Hi Cody,
previously I was not getting any output at GPIO 29, but I figured out that I need to change the position of the SW2 switch in ezDSP. Now I am getting an output at the transmitter. (attached)
however, still, I am not able to receive anything on the GPIO28. I even tried to send the data to the receiver of the same DSP and used the loopback code. I disabled the internal loopback and connected them externally.
I am not really sure but I there something wrong with my initialization of SCI?
Ankit,
Can you enable internal loopback to check that your receiver side has been configured correctly? If it works, then disable internal loopback and check that GPIO 28 has been correctly as an input.
Regards,
Cody
Thanks for pointing that out, I was able to make it work.
I made a mistake. The receiver has to be turned on before the transmitter. Once I did that I am able to send the data at a Baud rate of 2343750 without encountering any error.
Thank you
Ankit,
when using two ezDSP boards, are the grounds connected? One more test you could try is sending data SCIa-SCIb on the same ezDSP.
Excited to hear back!
Cody
Ankit,
I'm glad to hear your issue has been resolved. Note it is always a good idea to use a common ground with "single-ended" communication methods as ground is the signal reference.
Regards,
Cody