如何将16字节的数据转换成2条8字节的数据?

问题描述 投票:0回答:1

我使用的是 TMS320F28x 卡。我正在从 STM32 卡发送一个价值 16 个字节的结构。

我想在 TMS320F28x 卡上接收此数据。接收到数据后,我想把它分成2部分,每部分8个字节。我写的代码如下。我怎样才能实现这个目标?我提到的代码块位于 main 的 while 循环中。

#include "F2802x_Device.h"
#include "F2802x_Examples.h"
#include "DSP28x_Project.h"
#include "f2802x_globalprototypes.h"

#define LSPCLK_FREQ 1000
#define SCI_BAUDRATE 1200
#define SCI_PRD (Uint16)((LSPCLK_FREQ / (8 * SCI_BAUDRATE)) - 1)
#define DATA_SIZE 16

typedef struct Data {
    Uint16 received_data1;
    Uint16 received_data2;
    Uint16 received_data3;
    Uint16 received_data4;
    Uint16 received_data5;
    Uint16 received_data6;
} Data;

typedef struct TransmittedData {
    Uint32  latitude_high;
    Uint32  latitude_low;
    Uint32  longitude_high;
    Uint32  longitude_low;
} TransmittedData;

void Gpio_init(void);
void ProcessGpioData(const Data *d);
void Scia_fifo_init(void);
void delay_loop(long end);
void ReadSciData(Uint16 *data, Uint16 dataSize);
void InitSciP(void);
void TransmitData(const TransmittedData *data);
void InitSciaGpioR(void);

int main(void)
{
    Gpio_init();

//    InitPieCtrl();
//    InitPieVectTable();

    Uint16 receivedData[DATA_SIZE];
    InitSciaGpioR();
    //InitSysCtrl();
    InitSciP();
    Scia_fifo_init();
    Data d1;
    d1.received_data1 = GpioDataRegs.GPADAT.bit.GPIO0;
    d1.received_data2 = GpioDataRegs.GPADAT.bit.GPIO1;
    d1.received_data3 = GpioDataRegs.GPADAT.bit.GPIO2;
    d1.received_data4 = GpioDataRegs.GPADAT.bit.GPIO3;
    d1.received_data5 = GpioDataRegs.GPADAT.bit.GPIO4;
    d1.received_data6 = GpioDataRegs.GPADAT.bit.GPIO5;
    ProcessGpioData(&d1);
     //delay_loop(100000);
    while (1) {
         ReadSciData(receivedData, DATA_SIZE);
         TransmittedData tData;
         // 16 byte'lık veriyi 2 8 byte'lık veriye ayırma
         tData.latitude_high = (receivedData[0] << 8) & receivedData[1];
         tData.latitude_low = (receivedData[2] << 8) & receivedData[3];
         tData.longitude_high = (receivedData[4] << 8) & receivedData[5];
         tData.longitude_low = (receivedData[6] << 8) & receivedData[7];

         TransmitData(&tData);
     }
}

void delay_loop(long end)
{
    long i;
    for (i = 0; i < end; i++)
    {
        asm(" NOP");
        EALLOW;
        SysCtrlRegs.WDKEY = 0x55;
        SysCtrlRegs.WDKEY = 0xAA;
        EDIS;
    }
}

void ProcessGpioData(const Data *d) {
    if (d->received_data1 == 0) {
        GpioDataRegs.GPACLEAR.bit.GPIO16 = 1;
    } if (d->received_data2 == 1) {
        GpioDataRegs.GPASET.bit.GPIO17 = 1;
    } if (d->received_data3 == 0) {
        GpioDataRegs.GPBCLEAR.bit.GPIO32 = 1;
    } if (d->received_data4 == 1) {
        GpioDataRegs.GPBSET.bit.GPIO33 = 1;
    } if (d->received_data5 == 0) {
        GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;
    } if (d->received_data6 == 1) {
        GpioDataRegs.GPBSET.bit.GPIO38 = 1;
    }
}

void ReadSciData(Uint16 *data, Uint16 dataSize)
{
    Uint16 i;
    for (i = 0; i < dataSize; ++i)
    {
        while (SciaRegs.SCIFFRX.bit.RXFFST == 0) {
            // Bekleme
        }
        // SCI veri alımı
        data[i] = SciaRegs.SCIRXBUF.all;
    }
    // FIFO temizleme
    SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;
}

void TransmitData(const TransmittedData *data){
    // SCI TX FIFO temizleme
    while (SciaRegs.SCIFFTX.bit.TXFFST != 0)
        ;  // FIFO dolu olduğu sürece bekle
    SciaRegs.SCITXBUF = data->latitude_high;
    while (SciaRegs.SCIFFTX.bit.TXFFST != 0)
        ;  // FIFO dolu olduğu sürece bekle
    SciaRegs.SCITXBUF = data->latitude_low;
    while (SciaRegs.SCIFFTX.bit.TXFFST != 0)
        ;  // FIFO dolu olduğu sürece bekle
    SciaRegs.SCITXBUF = data->longitude_high;
    while (SciaRegs.SCIFFTX.bit.TXFFST != 0)
        ;  // FIFO dolu olduğu sürece bekle
    SciaRegs.SCITXBUF = data->longitude_low;
}

void Gpio_init(void){
    EALLOW;

    //for input pins
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;

    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO1 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;

    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO2 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0;

    GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO3 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;

    GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO4 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO4 = 0;

    GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO5 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0;

    //for output pins
    GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0; // selecting the gpio pin
    GpioCtrlRegs.GPADIR.bit.GPIO16 = 1; // 1 means output pin,0 means input pin
    GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; // input selection completed

    GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO17 = 1;
    GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;

    GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;
    GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1;
    GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;

    GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 0;
    GpioCtrlRegs.GPBDIR.bit.GPIO33 = 1;
    GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0;

    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
    GpioCtrlRegs.GPBPUD.bit.GPIO34 = 0;

    GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0;
    GpioCtrlRegs.GPBDIR.bit.GPIO38 = 1;
    GpioCtrlRegs.GPBPUD.bit.GPIO38 = 0;

    GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;
    GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0;

    EDIS;
}

void Scia_fifo_init()
{
    // 1 stop bit, 8 data bits, no parity
    SciaRegs.SCIFFCT.all = 0x00;  // Default FIFO settings
    SciaRegs.SCIFFTX.all = 0xE040;
    SciaRegs.SCIFFRX.all = 0x2044;
    SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 1;
    SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
    SciaRegs.SCICTL1.all = 0x0003;  // Enable TX, RX, internal SCICLK, Disable RX ERR, SLEEP, TXWAKE
    SciaRegs.SCICTL2.bit.TXINTENA = 0;    // Disable TX interrupt
    SciaRegs.SCICTL2.bit.RXBKINTENA = 0;  // Disable RX interrupt
    SciaRegs.SCIHBAUD = 0x0000;          // Baud rate high
    SciaRegs.SCILBAUD = SCI_PRD;         // Baud rate low
    SciaRegs.SCICTL1.all = 0x0023;        // Relinquish SCI from Reset
}

void InitSciP(void)
{
    // SCI ayarları
    SciaRegs.SCICCR.all = 0x0007;            // 1 stop bit, 8 char bits, no parity
    SciaRegs.SCICTL1.all = 0x0003;           // Enable TX, RX, internal SCICLK, Disable RX ERR, SLEEP, TXWAKE
    SciaRegs.SCICTL2.bit.TXINTENA = 0;       // TX interrupt disable
    SciaRegs.SCICTL2.bit.RXBKINTENA = 0;     // RX interrupt disable
    SciaRegs.SCIHBAUD = 405>>5;          // Baud rate high
    SciaRegs.SCILBAUD = SCI_PRD;         // Baud rate low
    SciaRegs.SCICTL1.all = 0x0023;           // Relinquish SCI from Reset
}

void InitSciaGpioR(void){
    EALLOW;
    GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; // Enable pull-up for GPIO19 (SCIRXDA)
    //GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0;

    GpioCtrlRegs.GPAPUD.bit.GPIO29 = 1;
    GpioCtrlRegs.GPAPUD.bit.GPIO18 = 1;
    //GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1;  // Disable pull-up for GPIO12 (SCITXDA)

    GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;  // Asynch input GPIO28 (SCIRXDA)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;  // Asynch input GPIO19 (SCIRXDA)
    //GpioCtrlRegs.GPAQSEL1.bit.GPIO7 = 3;   // Asynch input GPIO7 (SCIRXDA)

    GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 2;   // Configure GPIO28 for SCIRXDA
    GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 2;   // Configure GPIO19 for SCIRXDA
    //GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 2;    // Configure GPIO7  for SCIRXDA

    GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 2;   // Configure GPIO29 for SCITXDA
    GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 2;   // Configure GPIO18 for SCITXDA
    //GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 2;   // Configure GPIO12 for SCITXDA

    EDIS;
}

我尝试进行转换,但不确定其准确性。我在模拟环境中查看是否收到数据,但是观察到数据没有到达。

signal-processing microcontroller code-composer byte-shifting
1个回答
0
投票

我不确定您给出的示例代码与您的问题相关。但我从你的问题描述中了解到,你有一个 16 字节的值,并且你想分割成两个 8 字节。正确吗?

你可以做类似的事情;

struct tx_t
{ 
  uint16_t val;  
}tx_t;

int main()
{
  struct tx_t transmitted = {.val = 0x1234};

  uint8_t recv_buf[2] = { 0 };

  recv_buf[0] = (uint8_t)((transmitted.val >> 8) & 0xFF);
  recv_buf[1] = (uint8_t)(transmitted.val);

  printf("recv_buf[0] : 0x%x, recv_buf[1] : 0x%x", recv_buf[0], recv_buf[1]);
}
© www.soinside.com 2019 - 2024. All rights reserved.