For TMS320F2806x, I'm unable to get both SCIA and SCIB to work simultaneously. SCIA is on ports 28,29 and SCIB is on ports 22,23.
With the following code,
1. With SCIA transmitting, Hyperterminal receives ASCII characters.
2. But on SCIB transmitting, Hyperterminal receives gibberish characters.
3. If I disable SCIA, no characters are received from SCIB either.
Please review and make suggestions. TIA.
static void sci_a_init(void)
{
SciaRegs.SCIFFTX.bit.SCIRST = 1; // resume transmit or receive
SciaRegs.SCIFFTX.bit.SCIFFENA = 0; // use FIFO enhancements
SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 0; // re-enable transmit FIFO
SciaRegs.SCIFFTX.bit.TXFFST = 0; // empty FIFO
// SciaRegs.SCIFFTX.bit.TXFFINT = 0; // read-only 0 = no interrupt, 1 = interrupt has occurred
SciaRegs.SCIFFTX.bit.TXFFINTCLR = 1; // clear TXFFINT flag
SciaRegs.SCIFFTX.bit.TXFFIENA = 0; // Transmit FIFO interrupt based on TXFFIVL is disabled
SciaRegs.SCIFFTX.bit.TXFFIL = 0; // FIFO interrupt level (default to 0)
// SciaRegs.SCIFFRX.bit.RXFFOVF = 0; // read-only, 0 = no overflow, 1 = lost characters
// SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 0; // Clear FIFO overflow
SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1; // Clear FIFO overflow
SciaRegs.SCIFFRX.bit.RXFIFORESET = 1; // Re-enable FIFO
SciaRegs.SCIFFRX.bit.RXFFST = 0; // empty
// SciaRegs.SCIFFRX.bit.RXFFINT = 0; // read-only 0 = no interrupt, 1 = interrupt has occurred
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; // clear RXFFINT
SciaRegs.SCIFFRX.bit.RXFFIENA = 1; // RX FIFO disabled
// SciaRegs.SCIFFRX.bit.RXFFIL = 4; // RX FIFO interrupt level (number of characters in the buffer when interrupt occurs)
SciaRegs.SCIFFRX.bit.RXFFIL = 1; // RX FIFO interrupt level
SciaRegs.SCIFFCT.bit.ABD = 0; // Autobaud detection not complete
SciaRegs.SCIFFCT.bit.ABDCLR = 0; // no effect
SciaRegs.SCIFFCT.bit.CDC = 0; // disable autobaud
SciaRegs.SCIFFCT.bit.FFTXDLY = 0; // FIFO transfer delay
// Note: Clocks were turned on to the SCIA peripheral
// in the InitSysCtrl() function
asm(" EALLOW"); // Enable EALLOW protected register access
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // LSPCLK to SCI-A enabled
asm(" EDIS"); // Disable EALLOW protected register access
SciaRegs.SCICCR.bit.STOPBITS = 0; // one stop bit
SciaRegs.SCICCR.bit.PARITY = 0; // no parity
SciaRegs.SCICCR.bit.PARITYENA = 0; // parity disable, none generated
SciaRegs.SCICCR.bit.LOOPBKENA = 0; // loopback disabled
SciaRegs.SCICCR.bit.ADDRIDLE_MODE = 0; // Idle-line mode protocol
SciaRegs.SCICCR.bit.SCICHAR = 7; // 8 bit data
// SciaRegs.SCICTL1.bit.rsvd1 = 0;
SciaRegs.SCICTL1.bit.RXERRINTENA = 0; // disable Rx error
SciaRegs.SCICTL1.bit.SWRESET = 0; // initializes SCI and holds in reset
// SciaRegs.SCICTL1.bit.rsvd2 = 0;
SciaRegs.SCICTL1.bit.TXWAKE = 0; // wake-up not used
SciaRegs.SCICTL1.bit.SLEEP = 0; // sleep not used
SciaRegs.SCICTL1.bit.TXENA = 1; // enable transmitter
SciaRegs.SCICTL1.bit.RXENA = 1; // enable receiver
SciaRegs.SCICTL2.bit.TXINTENA = 1; // enable Tx complete interrupt
SciaRegs.SCICTL2.bit.RXBKINTENA = 1; // enable Rx/Break interrupt
SciaRegs.SCICTL1.bit.SWRESET = 1; // release reset
SCI_SetBaud(PortA, eBaud_9600);
// SCI_SetBaudA(eBaud_57600);
asm(" EALLOW"); // Enable EALLOW protected register access
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // Enable pull-up for GPIO28 (SCIRXDA)
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // 0 = GPIO 1 = SCIRXDA 2 = SDAA 3 = TZ2
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 1; // Enable pull-up for GPIO29 (SCITXDA)
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // Configure GPIO29 for SCITXDA operation
asm(" EDIS"); // Disable EALLOW protected register access
PieCtrlRegs.PIECTRL.bit.ENPIE = 0; // Disable the PIE, to make changes
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; // PIE Group 9, enable INT1 interrupt SCI-A Rx
// PieCtrlRegs.PIEIER9.bit.INTx2 = 1; // PIE Group 9, enable INT2 interrupt SCI-A Tx
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE
IER |= 0x0100; // Enable SCIRXINTA in IER to enable PIE group 9
}
static void sci_b_init(void)
{
ScibRegs.SCIFFTX.bit.SCIRST = 1; // resume transmit or receive
ScibRegs.SCIFFTX.bit.SCIFFENA = 0; // use FIFO enhancements
ScibRegs.SCIFFTX.bit.TXFIFOXRESET = 0; // re-enable transmit FIFO
ScibRegs.SCIFFTX.bit.TXFFST = 0; // empty FIFO
// ScibRegs.SCIFFTX.bit.TXFFINT = 0; // read-only 0 = no interrupt yet, 1 = interrupt has occurred
ScibRegs.SCIFFTX.bit.TXFFINTCLR = 1; // clear TXFFINT flag
ScibRegs.SCIFFTX.bit.TXFFIENA = 0; // Transmit FIFO interrupt based on TXFFIVL is disabled
ScibRegs.SCIFFTX.bit.TXFFIL = 0; // FIFO interrupt level (default to 0)
// ScibRegs.SCIFFRX.bit.RXFFOVF = 0; // read-only, 0 = no overflow, 1 = lost characters
// ScibRegs.SCIFFRX.bit.RXFFOVRCLR = 0; // Clear FIFO overflow
ScibRegs.SCIFFRX.bit.RXFFOVRCLR = 1; // Clear FIFO overflow
ScibRegs.SCIFFRX.bit.RXFIFORESET = 1; // Re-enable FIFO
ScibRegs.SCIFFRX.bit.RXFFST = 0; // empty
// ScibRegs.SCIFFRX.bit.RXFFINT = 0; // read-only 0 = no interrupt, 1 = interrupt has occurred
ScibRegs.SCIFFRX.bit.RXFFINTCLR = 1; // clear RXFFINT
ScibRegs.SCIFFRX.bit.RXFFIENA = 1; // RX FIFO enabled
ScibRegs.SCIFFRX.bit.RXFFIL = 1; // RX FIFO interrupt level
ScibRegs.SCIFFCT.bit.ABD = 0; // Autobaud detection not complete
ScibRegs.SCIFFCT.bit.ABDCLR = 0; // no effect
ScibRegs.SCIFFCT.bit.CDC = 0; // disable autobaud
ScibRegs.SCIFFCT.bit.FFTXDLY = 0; // FIFO transfer delay
// Note: Clocks were turned on to the SCIB peripheral
asm(" EALLOW"); // Enable EALLOW protected register access
SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1; // LSPCLK to SCI-B enabled
asm(" EDIS"); // Disable EALLOW protected register access
ScibRegs.SCICCR.bit.STOPBITS = 0; // one stop bit
ScibRegs.SCICCR.bit.PARITY = 0; // no parity
ScibRegs.SCICCR.bit.PARITYENA = 0; // parity disable, none generated
ScibRegs.SCICCR.bit.LOOPBKENA = 0; // loopback disabled
ScibRegs.SCICCR.bit.ADDRIDLE_MODE = 0; // Idle-line mode protocol
ScibRegs.SCICCR.bit.SCICHAR = 7; // 8 bit data
// ScibRegs.SCICTL1.bit.rsvd1 = 0;
ScibRegs.SCICTL1.bit.RXERRINTENA = 0; // disable Rx error
ScibRegs.SCICTL1.bit.SWRESET = 0; // initializes SCI and generates a reset
// ScibRegs.SCICTL1.bit.rsvd2 = 0;
ScibRegs.SCICTL1.bit.TXWAKE = 0; // wake-up not used
ScibRegs.SCICTL1.bit.SLEEP = 0; // sleep not used
ScibRegs.SCICTL1.bit.TXENA = 1; // enable transmitter
ScibRegs.SCICTL1.bit.RXENA = 1; // enable receiver
ScibRegs.SCICTL2.bit.TXINTENA = 1; // enable Tx complete interrupt
ScibRegs.SCICTL2.bit.RXBKINTENA = 1; // enable Rx/Break interrupt
ScibRegs.SCICTL1.bit.SWRESET = 1; // reload register after a system reset
SCI_SetBaud(PortB, eBaud_9600);
SCI_SelectGaugePort(Port1);
PieCtrlRegs.PIECTRL.bit.ENPIE = 0; // Disable the PIE, to make changes
PieCtrlRegs.PIEIER9.bit.INTx3 = 1; // PIE Group 9, enable INT3 interrupt SCI-B Rx
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE
IER |= 0x0100; // Enable SCIRXINTB in IER to enable PIE group 9
}
void SCI_SetBaud(SCI_Port p, BaudRates b)
{
unsigned int uHi;
unsigned int uLo;
unsigned long lClk;
if (SysCtrlRegs.LOSPCP.bit.LSPCLK == 0)
{
if (PLLon == TRUE)
{
lClk = SYSCLOCK * PLLmult / PLLdiv;
}
else
{
lClk = SYSCLOCK;
}
}
else
{
if (PLLon == TRUE)
{
// at power on, default is 1/4 of SYSCLOCK
lClk = SYSCLOCK * PLLmult / PLLdiv / (SysCtrlRegs.LOSPCP.bit.LSPCLK * 2);
}
else
{
// at power on, default is 1/4 of SYSCLOCK
lClk = SYSCLOCK / (SysCtrlRegs.LOSPCP.bit.LSPCLK * 2);
}
}
switch(b)
{
case eBaud_9600:
uHi = (lClk / (8 * 9600UL)) - 1;
uLo = uHi & 0x00FF;
uHi = uHi >> 8;
break;
case eBaud_57600:
uHi = (lClk / (8 * 57600UL)) - 1;
uLo = uHi & 0x00FF;
uHi = uHi >> 8;
break;
}
if (p == PortA)
{
SciaRegs.SCICTL1.bit.SWRESET = 0; // hold in reset until configuration complete
SciaRegs.SCIHBAUD = uHi;
SciaRegs.SCILBAUD = uLo;
SciaRegs.SCICTL1.bit.SWRESET = 1; // release reset
}
else if (p == PortB)
{
ScibRegs.SCICTL1.bit.SWRESET = 0; // hold in reset until configuration complete
ScibRegs.SCIHBAUD = uHi;
ScibRegs.SCILBAUD = uLo;
ScibRegs.SCICTL1.bit.SWRESET = 1; // release reset
}
else
{
// error, bad port selected
}
}
void SCI_SelectGaugePort(GaugePort p)
{
asm(" EALLOW"); // Enable EALLOW protected register access
// unselect current port
if (port == Port1)
{
// unselect 23 and 22
GpioCtrlRegs.GPAPUD.bit.GPIO23 = 1; // Disable pull-up for GPIO23 (SCIRXDB)
GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 0; // Synch input GPIO23 (SCIRXDB)
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0; // Unconfigure GPIO23 for SCIRXDB operation
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 1; // Disable pull-up for GPIO22 (SCITXDB)
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0; // Unconfigure GPIO22 for SCITXDB operation
}
else if (port == Port2)
{
// unselect 40 and 41
// GpioCtrlRegs.GPAPUD.bit.GPIO23 = 1; // Disable pull-up for GPIO23 (SCIRXDB)
// GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 0; // Synch input GPIO23 (SCIRXDB)
// GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0; // Unconfigure GPIO23 for SCIRXDB operation
// GpioCtrlRegs.GPAPUD.bit.GPIO22 = 1; // Disable pull-up for GPIO22 (SCITXDB)
// GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0; // Unconfigure GPIO22 for SCITXDB operation
}
else
{
// no port selected
}
// select new port
if (p == Port1)
{
// Rx = 23, Tx = 22
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0; // Enable pull-up for GPIO22 (SCITXDB)
//GpioCtrlRegs.GPAPUD.bit.GPIO22 = 1; // Enable pull-up for GPIO22 (SCITXDB)
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 3; // Configure GPIO22 for SCITXDB operation
GpioCtrlRegs.GPAPUD.bit.GPIO23 = 0; // Enable pull-up for GPIO23 (SCIRXDB)
GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 3; // Asynchronous input GPIO23 (SCIRXDB)
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 3; // Configure GPIO23 for SCIRXDB operation
port = p; // update current port
// Rx = 15, Tx = 18
}
else if (p == Port2)
{
// need to change Rx = 23, Tx = 22
// Rx = 41, Tx = 40
GpioCtrlRegs.GPBPUD.bit.GPIO40 = 0; // Enable pull-up for GPIO22 (SCITXDB)
GpioCtrlRegs.GPBMUX1.bit.GPIO40 = 2; // Configure GPIO22 for SCITXDB operation
GpioCtrlRegs.GPBPUD.bit.GPIO41 = 0; // Enable pull-up for GPIO23 (SCIRXDB)
GpioCtrlRegs.GPBQSEL1.bit.GPIO41 = 3; // Asynch input GPIO23 (SCIRXDB)
GpioCtrlRegs.GPBMUX1.bit.GPIO41 = 2; // Configure GPIO23 for SCIRXDB operation
port = p; // update current port
}
else
{
// invalid port selected
}
asm(" EDIS"); // Disable EALLOW protected register access
}
void sci_xmit(SCI_Port p, unsigned char a)
{
if (p == PortA)
{
while (SciaRegs.SCICTL2.bit.TXEMPTY == 0) // ready to put another character in transmit buffer
{
// wait for previous character to finish transmitting
// change to interrupt driven, if this takes too long
}
SciaRegs.SCITXBUF = (a & 0x00FF);
}
else if (p == PortB)
{
while (ScibRegs.SCICTL2.bit.TXEMPTY == 0)
{
// wait for previous character to finish transmitting
}
ScibRegs.SCITXBUF = (a & 0x00FF);
}
else
{
// bad port selected
}
}