TI的TMS320F28335,RS485串口进行SCI-B通信出错

TI的TMS320F28335,试图通过RS485串口进行SCI-B通信。目前不知道为什么只能收不能发。上位机可以传输数据到下位机(TI板)却无法收到下位机传出的数据。
无论是串口助手还是MATLAB都无法收到数据。
如果可以的话还想问一下怎么样在VS code里运行这个,不想用CCS了。

//###########################################################################
//
// FILE:    lab12-SCIB_RS485_PC
//
//
//
//
//       $Boot_Table:
//
//         GPIO87   GPIO86     GPIO85   GPIO84
//          XA15     XA14       XA13     XA12
 //           PU       PU         PU       PU
//        ==========================================
//            1        1          1        1    Jump to Flash
//            1        1          1        0    SCI-A boot
//            1        1          0        1    SPI-A boot
//            1        1          0        0    I2C-A boot
//            1        0          1        1    eCAN-A boot
//            1        0          1        0    McBSP-A boot
//            1        0          0        1    Jump to XINTF x16
//            1        0          0        0    Jump to XINTF x32
//            0        1          1        1    Jump to OTP
//            0        1          1        0    Parallel GPIO I/O boot
//            0        1          0        1    Parallel XINTF boot
//            0        1          0        0    Jump to SARAM        <- "boot to SARAM"
//            0        0          1        1    Branch to check boot mode
//            0        0          1        0    Boot to flash, bypass ADC cal
//            0        0          0        1    Boot to SARAM, bypass ADC cal
//            0        0          0        0    Boot to SCI-A, bypass ADC cal
//                                              Boot_Table_End$
//
//
//
//###########################################################################

//###########################################################################
#include "DSP2833x_Device.h"     // DSP2833x
#include "DSP2833x_Examples.h"   // DSP2833x
#include "stdlib.h"

/*
Transmission Protocol by Tao Ran and Li Yu;
Date: 2023.05.23;
sysState (1 bit) -> Start = 1 / Stop = 0;
CtrlMode (3 bit) -> Voltage = 000, Current = 001, Ikp = 010, Iki = 011, Icmd = 100, Xcmd = 101, Xkpi = 110, Xkd = 111;
Channel (4 bit) -> 1 = 0001, 2 = 0010, 3 = 0011, 4 = 0100, 5 = 0101, 6 = 0110, 7 = 0111, 8 = 1000, 9 = 1001, 10 = 1010;
Value -> 4 byte float;
Transmit 6 byte a time: message = sysState + CtrlMode + Channel + Value + transmission;
*/

// A -> 0 100 0001 -> stop + Icmd + channel 1;
/*
typedef struct DataPacket {
    unsigned sysState : 1; // 1 bit
    unsigned CtrlMode : 3; // 3 bits
    unsigned Channel : 4;   // 4 bits
    float Value;           // 4 bytes
} DataPacket;
*/
typedef struct DataPacket {
    unsigned char state : 8;
    float Value;           // 4 bytes
    unsigned char R_or_T : 8; // Receive or Transmit -> 0x0 = Receive, 0xff = Transmit
} DataPacket;

union CharFloat{ // unsigned char <-> float
    unsigned char str[2];
    float V;
};

float duty1cmd = 2, duty2cmd, duty3cmd, duty4cmd, duty5cmd, duty6cmd, duty7cmd, duty8cmd, duty9cmd, duty10cmd; // Voltage
float I1Cmd, I2Cmd, I3Cmd, I4Cmd, I5Cmd, I6Cmd, I7Cmd, I8Cmd, I9Cmd, I10Cmd; // Current
float I1kpi [2], I2kpi [2], I3kpi [2], I4kpi [2], I5kpi [2], I6kpi [2], I7kpi [2], I8kpi [2], I9kpi [2], I10kpi [2]; // Ikpi
float IpCmdX, InCmdX, IpCmdY, InCmdY, IpCmdZ, InCmdZ; // Icmd
float Xcmd[5]; //Xcmd
float X1kpid[3], X2kpid[3], Y1kpid[3], Y2kpid[3], Zkpid[3]; // Xkpid

unsigned char data0 = 0, data1 = 0x0, data2 = 0x0, data3 = 0x0, data4 = 0x0, data5 = 0, data6 = 0, data7 = 0, data8 = 0, data9 = 0;
unsigned char Channel = 0, sys_state = 0, ctrl_mode = 0;
float f_value = 0;

int t_time = 0;
unsigned char t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0;
unsigned char tran_temp = 0;

DataPacket Packet;
union CharFloat F;
/**********************************************************************************************/
void scib_echoback_init(void);
void scib_xmit(unsigned char byte);
void scib_msg(unsigned char *byte_ptr);
void scib_fifo_init(void);
void Update(void);
void Receive(unsigned char *byte_ptr);
void Transmit(unsigned char *byte_ptr);
void processCtrlMode(void);
void setDuty (void);
void setCurrent (void);
void setIkp (void);
void setIki (void);
void setIcmd (void);
void setXcmd (void);
void setXkpi (void);
void setXkd (void);
void ReadCtrlMode(void);
void ReadDuty (void);
void ReadCurrent (void);
void ReadIkp (void);
void ReadIki (void);
void ReadIcmd (void);
void ReadXcmd (void);
void ReadXkpi (void);
void ReadXkd (void);
unsigned char scib_rxmit ();
/**********************************************************************************************/

/**********************************************************************************************/
#define InitDIR()                                          \
                     EALLOW;                               \
                     GpioCtrlRegs.GPBPUD.bit.GPIO49 = 0;   \
                     GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1;   \
                     GpioDataRegs.GPBCLEAR.bit.GPIO49 = 1; \
                     EDIS;
#define RX_EN       GpioDataRegs.GPBCLEAR.bit.GPIO49 = 1;
#define TX_EN       GpioDataRegs.GPBSET.bit.GPIO49 = 1;
/**********************************************************************************************/
enum MODE  Mode;
enum CTRLMODE CtrlMode;
enum SYSSTATE sysState;
enum DATA Data;
enum DATA {
    position,
    Current
};
enum SYSSTATE {
    start,
    stop
};
enum CTRLMODE {
    voltage,
    current,
    pid,
    VibCtrl_CTM,
    PosTuning
};
enum MODE {
    debugging,
    operat
};

/********************************************************************************************************/
void main(void)
{
   InitSysCtrl();

   InitScibGpio();

   InitDIR();

   DINT;

   InitPieCtrl();

   IER = 0x0000;
   IFR = 0x0000;
   InitPieVectTable();

    scib_echoback_init();

    sysState = stop;
    CtrlMode = voltage;
    Data = position;
    Mode = debugging;

    while(1){ // No need for for-loop, just go while(1). Updated 2023.05.24 by Tao Ran
        /*
        unsigned char test = 0xff;
        scib_xmit(test);
        */

        // Update function now handles the receive and processing of a data packet
        Update();
    }
}

void Update(){  //Updated 2023.05.25 by Tao Ran
    
    unsigned char *byte_ptr = (unsigned char*) &Packet;

    // Now handle the data from the packet
    Receive(byte_ptr);

    if (data5 == 0xff){     // Transmit the data if the packet request transmission
        Transmit(byte_ptr);
    }else if (data5 == 0x00){   // Update the data if the packet request reception
        // Convert the data from the packet to a float
        F.str[0] = (data2<<8) + data1;
        F.str[1] = (data4<<8) + data3;
        f_value = F.V;

        // sysState processing
        (sys_state == 0)? (sysState = stop) : (sysState = start); 

        // Channel processing
        processCtrlMode();
    }
}

void Receive (unsigned char *byte_ptr){
    // Read the 6 bytes into our struct
    int i = 0;
    for(i = 0; i < 6; i++){
        unsigned char temp;
        temp = scib_rxmit();
        byte_ptr[i] = temp;
        //byte_ptr[i] = scib_rxmit(); // assuming this is the function to receive a byte

        switch(i){
            case 0:
                data0 = temp;   // data0 is state
                break;
            case 1:
                data1 = temp;   // data1 is float value byte 1
                break;
            case 2:
                data2 = temp;   // data2 is float value byte 2
                break;
            case 3:
                data3 = temp;   // data3 is float value byte 3
                break;
            case 4:
                data4 = temp;   // data4 is float value byte 4
                break;
            case 5:
                data5 = temp;   // data5 is recieve or transmit state
                break;
            default:
                break;
        }
    }
    /*
    byte_ptr[i] = scib_rxmit();
    byte_ptr[i] = scib_rxmit();
    */
    unsigned char temp = data0;
    Channel = temp &= 0b00001111;
    temp = data0;
    sys_state = temp &= 0b10000000;
    temp = data0;
    ctrl_mode = (temp &= 0b01110000)/16;
}

void Transmit(unsigned char *byte_ptr){
    byte_ptr[0] = data0;
    t0 = byte_ptr[0];

    ReadCtrlMode();

    F.V = f_value;

    unsigned char temp;
    // first 2 bytes of float
    temp = F.str[0];

    t2 = (temp &= 0xff00)>>8;
    byte_ptr[2] = t2;

    t1 = (temp &= 0x00ff);
    byte_ptr[1] = t1;

    // last 2 bytes of float
    temp = F.str[1];

    t4 = (temp &= 0xff00)>>8;
    byte_ptr[4] = t4;

    t3 = (temp &= 0x00ff);
    byte_ptr[3] = t3;

    // last byte of packet
    byte_ptr[5] = 0xff;

    // Initiate transmission
    scib_msg(byte_ptr);
}

//CtrlMode (3 bit) -> Voltage = 000, Current = 001, Ikp = 010, Iki = 011, Icmd = 100, Xcmd = 101, Xkpi = 110, Xkd = 111;
void processCtrlMode() {  //Updated 2023.05.24 by Tao Ran
    // Do something with CtrlMode and pass value to execute.
    switch(ctrl_mode) {
        case 0:
            // Voltage
            CtrlMode = voltage;
            setDuty();
            break;
        case 1:
            // Current
            CtrlMode = current;
            setCurrent();
            break;
        case 2:
            // Ikp
            CtrlMode = current;
            setIkp();
            break;
        case 3:
            // Iki
            CtrlMode = current;
            setIki();
            break;
        case 4:
            // Icmd
            CtrlMode = PosTuning;
            setIcmd();
            break;
        case 5:
            // Xcmd
            CtrlMode = pid;
            setXcmd();
            break;
        case 6:
            // Xkpi
            CtrlMode = pid;
            setXkpi();
            break;
        case 7:
            // Xkd
            CtrlMode = pid;
            setXkd();
            break;
        default:
            // Error
            break;
    }
}

void setDuty (){
    switch (Channel){
        case 0b0001:
            duty1cmd = f_value;
            break;
        case 0b0010:
            duty2cmd = f_value;
            break;
        case 0b0011:
            duty3cmd = f_value;
            break;
        case 0b0100:
            duty4cmd = f_value;
            break;
        case 0b0101:
            duty5cmd = f_value;
            break;
        case 0b0110:
            duty6cmd = f_value;
            break;
        case 0b0111:
            duty7cmd = f_value;
            break;
        case 0b1000:
            duty8cmd = f_value;
            break;
        case 0b1001:
            duty9cmd = f_value;
            break;
        case 0b1010:
            duty10cmd = f_value;
            break;
        default:
            // Error
            break;
    }
}

void setCurrent (){
    switch (Channel){
        case 0b0001:
            I1Cmd = f_value;
            break;
        case 0b0010:
            I2Cmd = f_value;
            break;
        case 0b0011:
            I3Cmd = f_value;
            break;
        case 0b0100:
            I4Cmd = f_value;
            break;
        case 0b0101:
            I5Cmd = f_value;
            break;
        case 0b0110:
            I6Cmd = f_value;
            break;
        case 0b0111:
            I7Cmd = f_value;
            break;
        case 0b1000:
            I8Cmd = f_value;
            break;
        case 0b1001:
            I9Cmd = f_value;
            break;
        case 0b1010:
            I10Cmd = f_value;
            break;
        default:
            // Error
            break;
    }
}

void setIkp (){
    switch (Channel){
        case 0b0001:
            I1kpi[0] = f_value;
            break;
        case 0b0010:
            I2kpi[0] = f_value;
            break;
        case 0b0011:
            I3kpi[0] = f_value;
            break;
        case 0b0100:
            I4kpi[0] = f_value;
            break;
        case 0b0101:
            I5kpi[0] = f_value;
            break;
        case 0b0110:
            I6kpi[0] = f_value;
            break;
        case 0b0111:
            I7kpi[0] = f_value;
            break;
        case 0b1000:
            I8kpi[0] = f_value;
            break;
        case 0b1001:
            I9kpi[0] = f_value;
            break;
        case 0b1010:
            I10kpi[0] = f_value;
            break;
        default:
            // Error
            break;
    }
}

void setIki (){
    switch (Channel){
        case 0b0001:
            I1kpi[1] = f_value;
            break;
        case 0b0010:
            I2kpi[1] = f_value;
            break;
        case 0b0011:
            I3kpi[1] = f_value;
            break;
        case 0b0100:
            I4kpi[1] = f_value;
            break;
        case 0b0101:
            I5kpi[1] = f_value;
            break;
        case 0b0110:
            I6kpi[1] = f_value;
            break;
        case 0b0111:
            I7kpi[1] = f_value;
            break;
        case 0b1000:
            I8kpi[1] = f_value;
            break;
        case 0b1001:
            I9kpi[1] = f_value;
            break;
        case 0b1010:
            I10kpi[1] = f_value;
            break;
        default:
            // Error
            break;
    }
}

void setIcmd (){
    switch (Channel){
        case 0b0001:
            IpCmdX = f_value;
            break;
        case 0b0010:
            InCmdX = f_value;
            break;
        case 0b0011:
            IpCmdY = f_value;
            break;
        case 0b0100:
            InCmdY = f_value;
            break;
        case 0b0101:
            IpCmdZ = f_value;
            break;
        case 0b0110:
            InCmdZ = f_value;
            break;
        default:
            // Error
            break;
    }
}

void setXcmd (){
    switch (Channel){
        case 0b0001:
            Xcmd[0] = f_value;
            break;
        case 0b0010:
            Xcmd[1] = f_value;
            break;
        case 0b0011:
            Xcmd[2] = f_value;
            break;
        case 0b0100:
            Xcmd[3] = f_value;
            break;
        case 0b0101:
            Xcmd[4] = f_value;
            break;
        default:
            // Error
            break;
    }
}

void setXkpi (){
    switch (Channel)
    {
    case 0b0001:
        X1kpid[0] = f_value;
        break;
    case 0b0010:
        X2kpid[0] = f_value;
        break;
    case 0b0011:
        Y1kpid[0] = f_value;
        break;
    case 0b0100:
        Y2kpid[0] = f_value;
        break;
    case 0b0101:
        Zkpid[0] = f_value;
        break;
    case 0b0110:
        X1kpid[1] = f_value;
        break;
    case 0b0111:
        X2kpid[1] = f_value;
        break;
    case 0b1000:
        Y1kpid[1] = f_value;
        break;
    case 0b1001:
        Y2kpid[1] = f_value;
        break;
    case 0b1010:
        Zkpid[1] = f_value;
        break;
    default:
        break;
    }
}

void setXkd (){
    switch (Channel)
    {
    case 0b0001:
        X1kpid[2] = f_value;
        break;
    case 0b0010:
        X2kpid[2] = f_value;
        break;
    case 0b0011:
        Y1kpid[2] = f_value;
        break;
    case 0b0100:
        Y2kpid[2] = f_value;
        break;
    case 0b0101:
        Zkpid[2] = f_value;
        break;
    default:
        break;
    }
}

unsigned char scib_rxmit (){
    while(ScibRegs.SCIRXST.bit.RXRDY != 1); // wait for XRDY =1 for empty state
    return ScibRegs.SCIRXBUF.all;   // Get character
}

// Transmit a character from the SCI
void scib_xmit(unsigned char byte){
    while (ScibRegs.SCICTL2.bit.TXRDY == 0);    // Wait for TXRDY =1 for empty state
    tran_temp = byte;
    ScibRegs.SCIRXBUF.all = byte;   // Send data
    t_time++;
}

void scib_msg(unsigned char * byte_ptr)
{
    int i = 0;
    t_time = 0;
    TX_EN;
    while(i < 6)    // Send characters until null character is reached
    {
        scib_xmit(byte_ptr[i]); // Send character
        i++;
    }
    /*
    scib_xmit(0x0D);
    scib_xmit(0x0A);
    scib_xmit(0x0D);
    scib_xmit(0x0A);
    */
    RX_EN;
}

// Initialize the SCI FIFO
void scib_fifo_init()
{
    ScibRegs.SCIFFTX.all=0xE040;
    ScibRegs.SCIFFRX.all=0x2044;
    ScibRegs.SCIFFCT.all=0x0;
}

void scib_echoback_init()
{
    // Note: Clocks were turned on to the SCIA peripheral
    // in the InitSysCtrl() function
    ScibRegs.SCICTL1.bit.SWRESET =0;
     ScibRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                   // No parity,8 char bits,
                                   // async mode, idle-line protocol
    ScibRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                   // Disable RX ERR, SLEEP, TXWAKE

    #if (CPU_FRQ_150MHZ)
          ScibRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 37.5MHz.
          ScibRegs.SCILBAUD    =0x00E7;
    #endif
    #if (CPU_FRQ_100MHZ)
          ScibRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 20MHz.
          ScibRegs.SCILBAUD    =0x0044;
    #endif
    ScibRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset
}

void ReadCtrlMode() {  //Updated 2023.05.31 by Tao Ran
    // Do something with CtrlMode and pass value to execute.
    switch(ctrl_mode) {
        case 0:
            // Voltage
            ReadDuty();
            break;
        case 1:
            // Current
            ReadCurrent();
            break;
        case 2:
            // Ikp
            ReadIkp();
            break;
        case 3:
            // Iki
            ReadIki();
            break;
        case 4:
            // Icmd
            ReadIcmd();
            break;
        case 5:
            // Xcmd
            ReadXcmd();
            break;
        case 6:
            // Xkpi
            ReadXkpi();
            break;
        case 7:
            // Xkd
            ReadXkd();
            break;
        default:
            // Error
            f_value = 0x0;
            break;
    }
}

void ReadDuty (){
    switch (Channel){
        case 0b0001:
            f_value = duty1cmd;
            break;
        case 0b0010:
            f_value = duty2cmd;
            break;
        case 0b0011:
            f_value = duty3cmd;
            break;
        case 0b0100:
            f_value = duty4cmd;
            break;
        case 0b0101:
            f_value = duty5cmd;
            break;
        case 0b0110:
            f_value = duty6cmd;
            break;
        case 0b0111:
            f_value = duty7cmd;
            break;
        case 0b1000:
            f_value = duty8cmd;
            break;
        case 0b1001:
            f_value = duty9cmd;
            break;
        case 0b1010:
            f_value = duty10cmd;
            break;
        default:
            // Error
            f_value = 0x0;
            break;
    }
}

void ReadCurrent (){
    switch (Channel){
        case 0b0001:
            f_value = I1Cmd;
            break;
        case 0b0010:
            f_value = I2Cmd;
            break;
        case 0b0011:
            f_value = I3Cmd;
            break;
        case 0b0100:
            f_value = I4Cmd;
            break;
        case 0b0101:
            f_value = I5Cmd;
            break;
        case 0b0110:
            f_value = I6Cmd;
            break;
        case 0b0111:
            f_value = I7Cmd;
            break;
        case 0b1000:
            f_value = I8Cmd;
            break;
        case 0b1001:
            f_value = I9Cmd;
            break;
        case 0b1010:
            f_value = I10Cmd;
            break;
        default:
            // Error
            break;
    }
}

void ReadIkp (){
    switch (Channel){
        case 0b0001:
            f_value = I1kpi[0];
            break;
        case 0b0010:
            f_value = I2kpi[0];
            break;
        case 0b0011:
            f_value = I3kpi[0];
            break;
        case 0b0100:
            f_value = I4kpi[0];
            break;
        case 0b0101:
            f_value = I5kpi[0];
            break;
        case 0b0110:
            f_value = I6kpi[0];
            break;
        case 0b0111:
            f_value = I7kpi[0];
            break;
        case 0b1000:
            f_value = I8kpi[0];
            break;
        case 0b1001:
            f_value = I9kpi[0];
            break;
        case 0b1010:
            f_value = I10kpi[0];
            break;
        default:
            // Error
            f_value = 0x0;
            break;
    }
}

void ReadIki (){
    switch (Channel){
        case 0b0001:
            f_value = I1kpi[1];
            break;
        case 0b0010:
            f_value = I2kpi[1];
            break;
        case 0b0011:
            f_value = I3kpi[1];
            break;
        case 0b0100:
            f_value = I4kpi[1];
            break;
        case 0b0101:
            f_value = I5kpi[1];
            break;
        case 0b0110:
            f_value = I6kpi[1];
            break;
        case 0b0111:
            f_value = I7kpi[1];
            break;
        case 0b1000:
            f_value = I8kpi[1];
            break;
        case 0b1001:
            f_value = I9kpi[1];
            break;
        case 0b1010:
            f_value = I10kpi[1];
            break;
        default:
            // Error
            f_value = 0x0;
            break;
    }
}

void ReadIcmd (){
    switch (Channel){
        case 0b0001:
            f_value = IpCmdX;
            break;
        case 0b0010:
            f_value = InCmdX;
            break;
        case 0b0011:
            f_value = IpCmdY;
            break;
        case 0b0100:
            f_value = InCmdY;
            break;
        case 0b0101:
            f_value = IpCmdZ;
            break;
        case 0b0110:
            f_value = InCmdZ;
            break;
        default:
            // Error
            f_value = 0x0;
            break;
    }
}

void ReadXcmd (){
    switch (Channel){
        case 0b0001:
            f_value = Xcmd[0];
            break;
        case 0b0010:
            f_value = Xcmd[1];
            break;
        case 0b0011:
            f_value = Xcmd[2];
            break;
        case 0b0100:
            f_value = Xcmd[3];
            break;
        case 0b0101:
            f_value = Xcmd[4];
            break;
        default:
            // Error
            f_value = 0x0;
            break;
    }
}

void ReadXkpi (){
    switch (Channel)
    {
    case 0b0001:
        f_value = X1kpid[0];
        break;
    case 0b0010:
        f_value = X2kpid[0];
        break;
    case 0b0011:
        f_value = Y1kpid[0];
        break;
    case 0b0100:
        f_value = Y2kpid[0];
        break;
    case 0b0101:
        f_value = Zkpid[0];
        break;
    case 0b0110:
        f_value = X1kpid[1];
        break;
    case 0b0111:
        f_value = X2kpid[1];
        break;
    case 0b1000:
        f_value = Y1kpid[1];
        break;
    case 0b1001:
        f_value = Y2kpid[1];
        break;
    case 0b1010:
        f_value = Zkpid[1];
        break;
    default:
        break;
    }
}

void ReadXkd (){
    switch (Channel)
    {
    case 0b0001:
        f_value = X1kpid[2];
        break;
    case 0b0010:
        f_value = X2kpid[2];
        break;
    case 0b0011:
        f_value = Y1kpid[2];
        break;
    case 0b0100:
        f_value = Y2kpid[2];
        break;
    case 0b0101:
        f_value = Zkpid[2];
        break;
    default:
        break;
    }
}


1、量下向上位机发送时,RS485的方向引脚是否使能为发送了;
2、发送数据实现,先将方向引脚切换为发送,等待延时1ms左右,再将调用发送函数。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    回答:

    对于RS485 SCI-B通信不能发送数据的问题,可能是以下几个原因导致:

    1. UART初始化设置有误。

    您可以检查串口的设置是否正确,例如波特率、数据位数、停止位数、奇偶校验位等是否正确设置。确保与上位机通信的设置保持一致。

    1. 发送数据的方式有误。

    您可以在发送数据时检查相应的代码是否正确,例如发送的数据是否放在正确的地址上,数据是否正确传输等。可以通过在代码中加入Debug打印,观察数据的传输情况,找到问题所在。

    1. 偏置电压设置有误。

    在RS485通信中,偏置电压非常重要。偏置电压的设置有误,可能会导致通信异常。您可以检查偏置电压是否正确设置。

    针对如何在VS code中运行TMS320F28335的问题,可以使用Code Composer Studio (CCS)插件来实现。该插件为VS Code提供了与CCS密切相关的构建、调试和设置功能。在VS Code中安装TI-CCS插件后,将您的TMS320F28335项目导入VS Code,即可在VS Code中运行和调试代码。

    以下是可能的解决方法(仅供参考):

    1. 检查串口初始化设置是否正确。

    c void sci_init(void) { ScibRegs.SCICCR.all = 0x0007; // 1位起始位,8位数据位,无奇偶校验位,1位停止位 ScibRegs.SCICTL1.all = 0x0003; // 使能SCI-B和SCI-B发送 ScibRegs.SCICTL2.all = 0x0003; // 接收中断使能 ScibRegs.SCIHBAUD = (baudrate >> 8) & 0xFF; ScibRegs.SCILBAUD = baudrate & 0xFF; // 波特率设置 ScibRegs.SCICTL1.all = 0x0023; // 使能SCI-B和SCI-B接收 }

    1. 检查数据发送方式是否正确。

    c void sci_senddata(unsigned char *data, unsigned int length) { int i; for (i = 0; i < length; i++) { ScibRegs.SCITXBUF = data[i]; while (ScibRegs.SCICTL2.bit.TXEMPTY == 0) ; //等待发送完成 //scib_fifo_init(); } }

    1. 检查偏置电压设置是否正确。

    c EALLOW; GpioCtrlRegs.GPBPUD.bit.GPIO62 = 0; GpioCtrlRegs.GPBMUX2.bit.GPIO62 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO62 = 1; GpioDataRegs.GPBSET.bit.GPIO62 = 1; // 设置为高电平状态 EDIS;

    1. 针对如何在VS code中运行TMS320F28335,可以安装TI-CCS插件。

    a. 在VS Code中搜索TI-CCS插件进行安装,或者通过以下命令安装插件:

    bash code --install-extension ti-cgt-c2000

    b. 打开VS Code,导入TMS320F28335项目。

    c. 在VS Code中使用CCS插件进行构建、运行和调试代码。

    总之,如果您遇到任何问题,请仔细检查您的代码、工具设置和硬件连接,或者咨询相关技术支持人员寻求解决方法。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

只能传输不能收发的问题,首先要检查下SCI串口通信相关配置是有问题。比如,波特率不匹配、数据位、停止位和校验位不匹配等等。需要重点检查下。其次,检查RS485的连接是否问题,比如接错了或者有损坏等。
如果你想要使用vscode运行首先需要在vscode中安装C语言支持扩展,vscode默认是什么c的扩展的,这个怎么安装你可以上网找下,很多资料的。之后再讲代码复制进去运行。

检查波特率、数据位、校验位和停止位等串口参数是不是匹配好

可以参考下

 void Scib_echoback_init() //     SCI初始化
 {
     // Note: Clocks were turned on to the SCIA peripheral
     // in the InitSysCtrl() function
 
      ScibRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                                         // No parity,8 char bits,
                                                         // async mode, idle-line protocol
     ScibRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal ScibLK,
                                                        // Disable RX ERR, SLEEP, TXWAKE
 
     ScibRegs.SCICTL1.bit.RXERRINTENA=1; //使能错误接收中断
 
     ScibRegs.SCICTL2.all =0x0003;
     ScibRegs.SCICTL2.bit.TXINTENA = 1;
     ScibRegs.SCICTL2.bit.RXBKINTENA =1;
 
     #if (CPU_FRQ_150MHZ)
           ScibRegs.SCIHBAUD    =0x0000;                                                   
                                                             // 19200 baud @LSPCLK = 37.5MHz.
           ScibRegs.SCILBAUD    =0x00F3;
     #endif
     #if (CPU_FRQ_100MHZ)
       ScibRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 20MHz.
       ScibRegs.SCILBAUD    =0x0044;
     #endif
     ScibRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset
 }
 interrupt void SCIRXINTB_ISR(void)     // SCI-B中断
 {
 
     if(ScibRegs.SCIRXST.bit.RXERROR == 1)    //SW RESET
     {
            ScibRegs.SCICTL1.bit.SWRESET = 0;
            DELAY_US(1000);
            ScibRegs.SCICTL1.bit.SWRESET = 1;
     }
 
    
 //   正常SCI中断函数
 //   ...
 //   ...
 //   ...
 
     PieCtrlRegs.PIEACK.bit.ACK9 = 1;
     EINT;
 }

基于ChatGpt Plus版参考回答:出现收到但无法发送数据的问题可能是由于以下几个原因引起的:

  1. 波特率设置不匹配:确保上位机和下位机之间的波特率设置一致。检查您的代码或配置,确保两端的串口波特率设置相同。

  2. 数据格式错误:检查数据格式是否正确,包括数据位、停止位和奇偶校验位等。确保上位机和下位机的数据格式设置相匹配。

  3. 硬件连接问题:检查串口连接是否正确,包括引脚连接、线缆连接和终端电阻设置等。确保RS485通信的收发线路连接正确,并且终端电阻已经正确设置。

  4. 发送数据缓冲区溢出:如果您的下位机发送数据过于频繁或发送数据量较大,可能会导致发送缓冲区溢出。确保发送数据的频率和数据量在下位机能够处理和发送的范围之内。

  5. 软件配置错误:检查您的代码或配置,确保正确设置了串口的发送和接收功能,并且使能了相关的中断或标志位。