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.

[参考译文] TM4C129XNCZAD:如何检查代码中的数据包

Guru**** 2390755 points
Other Parts Discussed in Thread: ADS1248

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1117549/tm4c129xnczad-how-to-check-the-data-packet-in-code

器件型号:TM4C129XNCZAD
主题中讨论的其他器件:ADS1248

您好!

我正在使用 TM4C129XNZAD 微控制器、从该项目开始、我需要将一些实时数据传输到表通信。 对于实时数据传输、我正在使用 IBP 仿真器。因此、我不知道仿真器数据是如何存储的以及数据存储的变量。 另外、请告诉我如何检查数据包。 我将在下面的附件中共享代码。 任何人都请帮助我检查数据包和仿真器变量。

代码如下所示、

[由于尺寸过大而删除代码]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    IBP 代码和数据包代码:

    /*
    * IBP.c
    *
    *创建日期:2017年7月24日
    *作者:Adhitya GN
    *


    /*********
    *
    *版权所有2018、Vasmed Health Sciences Pvt。 有限公司。
    *
    *文件名:IBP.c
    *作者:Adhitya GN
    *$Revision:-
    *$Date:-
    *
    *说明:
    *将从此处执行与 IBP 板以及形成数据包和发送数据包相关的所有代码。
    *
    *
    (一 /

    #include "main.h"
    #include "IBP.h"
    #include "SPPLEDemo.h"

    #include
    #include
    #include "SPPLEDemo.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/gpio.h"
    #include "driverlib/ssi.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/watchdog.h"

    //

    //******** typedef *********

    typedef 结构 hex_val

    uint32_t 参数[3];
    } hex_value;

    //


    //********* 函数声明********

    void IBP_initialize();
    void send_data (unsigned char);
    void receive_data (int);
    hex_value 接收数据1 (int);
    void IBP_exec();
    void bt_transmit (hex_value);
    bool IBP_self_test();


    //


    //******** 全局变量*********

    bool self_test_indicator=false;//这会告诉所有函数自检已完成或没有// true=已完成。

    bool live_procedure =false;//输入患者信息后、进入实时屏幕后、只能进行均衡。
    byte_t data[data_packet_size];//数据包。
    bool 锁;

    //


    /*********
    *函数:IBP_Initialize()
    *
    *说明:此函数在调度函数和之前从 Main.c 中调用
    *进行自检。 这在初始化 IBP 板(复用、速度等)后调用
    *这用于初始化 IBP 板操作所需的 ADC 寄存器
    并执行内部 ADC 校准。
    *
    *参数:空
    *
    *返回:null
    *
    *可重入性:否
    *
    *执行要求/假设:空
    *
    (小部分 /


    void IBP_Initialize()

    显示(("\n IBP_Initialize");

    uint32_t pui32DataRx[NUM_SSI_DATA];
    while (SSIDataGetNonBlocking (SSI2_base、&pui32DataRx[0]))

    SysCtlDelay (650000);//= 17ms。
    SysCtlDelay (50000);
    SEND_DATA (ADS1248_CMD_RESET);
    SysCtlDelay (50000);
    SEND_DATA (ADS1248_CMD_SDATAC);

    SEND_DATA (ADS1248_CMD_SELFOCAL);
    Receive_data (1);
    SysCtlDelay (6500000);//17ms

    SEND_DATA (ADS1248_CMD_WREG);//40h
    SEND_DATA (ADS1248_3_SYS0);//03h
    SEND_DATA (ADS1248_1_VBIAS);//01h
    SEND_DATA (ADS1248_0_MUX0);//00h
    SEND_DATA (ADS1248_2_MUX1);//03h
    //SEND_DATA (ADS1248_14_GAIN);//42h ADS1248_14_SPS
    SEND_DATA (ADS1248_15_SPS);//从5sps (以上)设置为1000sps。当前设置为160sps (或其他) sps。

    //Display (("\n 测试- rx=8---- 1\n");
    Receive_data (8);

    SEND_DATA (ADS1248_CMD_RREG);//20h
    SEND_DATA (ADS1248_3_SYS0);//03h


    //显示("\n 接收-- Rx=2----- 1\n");
    Receive_data (2);
    //显示("\n 接收=原始--- 2\n");
    SEND_DATA (ADS1248_CMD_NOP);
    Receive_data (1);
    SEND_DATA (ADS1248_CMD_NOP);
    Receive_data (1);
    SEND_DATA (ADS1248_CMD_NOP);
    Receive_data (1);
    SEND_DATA (ADS1248_CMD_NOP);
    Receive_data (1);

    SEND_DATA (ADS1248_CMD_SYSGCAL);
    Receive_data (1);
    SysCtlDelay (6500000);//17ms

    //14 ---- 使用 WREG 命令(40h、03h、01h、00h、03h 和42h)写入相应的寄存器配置; --37页数据表
    SEND_DATA (ADS1248_CMD_WREG);//40h
    SEND_DATA (ADS1248_3_SYS0);//03h
    SEND_DATA (ADS1248_1_VBIAS);//01h
    SEND_DATA (ADS1248_0_MUX0);//00h
    SEND_DATA (ADS1248_0_MUX0);//03h
    SEND_DATA (ADS1248_15_SPS);//42h

    Receive_data (6);

    SEND_DATA (ADS1248_CMD_RREG);//20h
    SEND_DATA (ADS1248_3_SYS0);
    Receive_data (2);

    SEND_DATA (ADS1248_CMD_NOP);
    Receive_data (1);
    SEND_DATA (ADS1248_CMD_NOP);
    Receive_data (1);
    SEND_DATA (ADS1248_CMD_NOP);
    Receive_data (1);
    SEND_DATA (ADS1248_CMD_NOP);
    Receive_data (1);

    SEND_DATA (ADS1248_CMD_SYNC);//05h
    SEND_DATA (ADS1248_CMD_SYNC);//05h--- ////因为我们必须提供两次 SYNC 命令--pg 38
    Receive_data (2);
    SysCtlDelay (650000);
    //GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_2、GPIO_PIN_2);


    /*********
    *函数:send_data()
    *
    *说明:将数据发送到 ADC(以便与 ADC 寄存器通信)以便通过 SSI 进行通信
    *将基板板连接到 IBP 板的 ADC
    *
    *参数:要发送到 ADC 的数据
    *
    *返回:null
    *
    *可重入性:是。 当计划执行 IBP_exec()函数时,每隔10ms 也会执行一次。
    *
    *执行要求/假设:空
    *
    (小部分 /


    void send_data (无符号字符字节)

    SSIDataPut (SSI2_base、字节);
    while (SSIBusy (SSI2_base))



    /*********
    *函数:receive_data()
    *
    *说明:通过 SSI 从 ADC 接收数据到基板。此数据主要是垃圾数据。 在 SSI 中、
    *对于您发送的每一个数据(数据到寄存器以访问读取/写入/任何内容)、将有相同数量的
    您将接收的*个字节。 这些数据是垃圾数据。 那么、它在这里接收。
    *
    *参数:要读取/接收的字节数。
    *
    *返回:null
    *
    *可重入性:是。 当计划执行 IBP_exec()函数时,每隔10ms 也会执行一次。
    *
    *执行要求/假设:空
    *
    (小部分 /


    void receive_data (int n)

    uint8_t ui32Index;
    uint32_t pui32DataRx[10];
    //uint32_t comp[10];

    for (ui32Index = 0;ui32Index < n;ui32Index++)

    //
    //使用“阻塞”GET 函数接收数据。 此函数
    //将等待接收 FIFO 中有数据后再返回。
    //
    SSIDataGet (SSI2_base、&pui32DataRx[ui32Index]);
    //
    //由于我们使用的是8位数据,所以屏蔽 MSB。
    //
    pui32DataRx[ui32Index]&= 0x00FF;

    //
    //显示 SSI0接收到的数据。
    //

    //comp[ui32Index]=(0xFF- pui32DataRx[ui32Index])+0x01;


    /*********
    *函数:receive_data1 ()
    *
    *说明:在上述函数 receive_data()中,我们收到了垃圾值。 但在该函数中、是
    *收到实际数据。 在我们发送 NOP 后、我们收到了用于发送 NOP 的垃圾数据、
    *然后、我们将调用此函数来接收所需的数据。 使用的 ADC 为24位。 那么、3字节的数据
    *将存在、我们需要所有3个字节的数据来从原始 ADC 值中形成 ADC 压力值。 所以、
    *所有3个字节都应位于单个变量/结构中。
    *
    *参数:要读取/接收的字节数。
    *
    *返回:存储所有3个字节的原始 ADC 数据的结构。
    *
    *可重入性:是。 当计划执行 IBP_exec()函数时,每隔10ms 也会执行一次。
    *
    *执行要求/假设:空
    *
    (小部分 /


    hex_value receive_data1 (int n)//此函数将提供必要的 ADC 值

    byte_t x_2;//具有原始 ADC 数据的第2个字节。 这是全部三个字节中最重要的字节。
    uint8_t ui32Index;
    uint32_t pui32DataRx[3];//捕获从 SSI 读取的数据。
    // 2是初始值。 0=未连接。 1=已连接。
    struct hex_val value;//存储3个字节的 ADC 原始数据的结构。 这将是返回值。


    uint8_t count=0;//类似于 ui32Index。这是第二次。
    uint32_t IBP_Collect[3];//类似于 pui32DataRx。这是第二次。

    for (ui32Index = 0;ui32Index < n;ui32Index++)

    //Display ("\n1");
    //
    //使用“阻塞”GET 函数接收数据。 此函数
    //将等待接收 FIFO 中有数据后再返回。
    //

    SSIDataGet (SSI2_base、&pui32DataRx[ui32Index]);
    pui32DataRx[ui32Index]&= 0x00FF;
    //显示(("ui32=%x"、pui32DataRx[ui32Index]);

    if (ui32Index=0)//MSB

    //不做任何操作,因为我不需要 MSB。 当压力存在时、它始终为0。
    value.Parameters[0]= pui32DataRx[ui32Index];

    否则、如果(ui32Index==1)//中间数据。 第2个字节

    value.Parameters[1]=pui32DataRx[ui32Index];
    x_2=pui32DataRx[ui32Index];//x_2具有 ADC 值、即中间数据
    //Display (("x=%d"、x));

    否则、如果(ui32Index===2)//LSB。现在接收到全部3个字节

    //Display (("\n2"));
    value.Parameters[2]= pui32DataRx[ui32Index];

    if ((x_2 == IBP_LOW_LIMIT)||(x_2 > IBP_UPPER _LIMIT))//如果 IBP 不工作//--if =0或大于75

    //显示("\n IBP 不工作");

    //Display ("\nx_2=%");
    GPIOPinWrite (GPIO_PORTK_base、GPIO_PIN_2、0x00);//关闭电源控制,关闭 IBP 板
    //SysCtlDelay (900);//--重要----- //这些关闭/打开是为了解决 EMI/EMC 问题。
    GPIOPinWrite (GPIO_PORTK_base、GPIO_PIN_2、GPIO_PIN_2);//在电源控制上,IBP 板处于打开状态
    //SysCtlDelay (10000);
    SEND_DATA (ADS1248_CMD_RDATA);// 13h //这5行最初是在 IBP_exec 中完成的。现在,这是第二轮
    Receive_data (1);
    SEND_DATA (ADS1248_CMD_NOP);
    SEND_DATA (ADS1248_CMD_NOP);
    SEND_DATA (ADS1248_CMD_NOP);
    ERR=AO_SENSORE_NOT _attached;//从传感器读取数据时出现问题。
    lock=false;
    ErrorHandler( false,4);

    对于(count = 0;count < n;count++)//2nd count

    //Display (("\n4"));
    SSIDataGet (SSI2_base、&IBIP_COLLECK_COUNT]);
    IBP_COLLECK_COUNT[COUNT]和= 0x00FF;

    if (count = 0)

    Value.Parameters[0]= IBP_Collect[count];

    否则、如果(count = 1)

    Value.Parameters[1]=IBP_Collect[count];
    x_2=IBP_COLLECTION[COUNT];

    否则、如果(count=2)//2nd if

    //Display (("\n5"));
    Value.Parameters[2]= IBP_Collect[count];


    }//结束否则 IBP=第一次尝试时正常
    }//结束(如果 uindex=2),第1次尝试,第3个字节,内部。MSB 忽略,中间捕获,第3个,此字节。

    其他

    //显示("\n lock==== %d"、错误));
    if ((lock=false))

    //显示("\n IBP 正在工作");
    lock=true;
    ERR=AO_SENSORE_attached;
    //显示("\nx_2=== %d"、错误));

    ErrorHandler( true,4);

    }//循环结束,收到第一次尝试3个字节。

    //Display ("\nx_2===== %d"、x_2)));

    }//function

    return (value);//返回3字节/结构。


    /*********
    *函数:IBP_exec()
    *
    *说明:这是从调度算法调用的。 这是 IBP.c 中的主要功能
    *在自检完成后,将调用此函数来收集-
    * 1- IBP 数据,2-格式数据包,3-调用通过蓝牙发送数据包的函数,4-从待机模式唤醒
    *但在该函数中、实际只会发生待机。此函数会发生其他情况
    *进行函数调用以执行其他点:1、2、3发生。
    *
    *参数:空
    *
    *返回:null
    *
    *可重入性:是。 每10毫秒
    *
    *执行要求/假设:空
    *
    (小部分 /


    void IBP_exec ()

    bool emc_ission=false;
    if (emc_issue=false)

    ERR=ERR_PD_Attached;
    ErrorHandler( true,5);
    Display (("\NIBP _exec"));
    emc_issue=true;

    struct hex_val x_1;//此处将收集原始 ADC 值的3个字节结构。

    if (self_test_indicator=true)//如果自检完成。当我进入 STANDBY_MODE 时,我也将进行自检
    //未完成。

    SEND_DATA (ADS1248_CMD_RDATA);// 13h //从发生 ADC 转换的 ADC IC 寄存器中读取数据。
    Receive_data (1);//接收垃圾数据(来自 SSI comm'n'),我在上面的这个文件中对此进行了解释。
    SEND_DATA (ADS1248_CMD_NOP);// 3字节 ADC。 因此、通过 SSI 通信发送3个8位时钟。
    SEND_DATA (ADS1248_CMD_NOP);
    SEND_DATA (ADS1248_CMD_NOP);
    x_1=receive_data1 (3);//--- 此处是从 SSI 通信接收实际 ADC 数据的位置

    BT_transmit (x_1);//通过蓝牙将数据传输到平板电脑。(从3个字节获取 IBP 单个数据,形成数据包,
    //通过蓝牙发送数据包。



    /*********
    *函数:BT_transmit ()
    *
    *说明:此函数将从3个原始 ADC 值字节中获取2个字节。 2格式数据包、
    * 3-调用函数(位于 sppdemo.c 中)以通过蓝牙通信发送数据。
    *
    *参数:将 IBP 原始 ADC 数据的3字节结构作为参数。
    *
    *返回:null
    *
    *可重入性:是
    *
    *执行要求/假设:空
    *
    (小部分 /

    void bt_transmit (hex_value x)

    uint8_t var=0;
    int crc=0,crc1=0;//警告--- 切勿互换此项和低于此项。 如果它不按此顺序、您将会这样做
    uint8_t crc_i=0;

    显示("\n bt_transmit);

    静态 int 序列;


    ///------------------------------ 形成数据包---------------------------------


    for (var=0;var {
    switch (var)

    情况0://指示位(无论它是数据还是命令)。

    data[var]=packet_datas;// 0表示它的数据(对于 command=1)

    //Display (("\nressult[var],var0=%d->%d",var,data[var]);
    中断;

    案例1://for RJC MSB

    data[var]= SPPLEBuffer[var-1];
    display("\nresult[var]、var1->%d"、data[var]);

    中断;

    案例2://for RJC lsb

    data[var]= SPPLEBuffer[var-2];
    display("\nresult[var]、var2->%d"、data[var]);
    中断;

    案例3://对于 IBP 中间。忽略 IBP MSB

    data[var]=x.Parameters[1];
    //显示("\nResult[var],var3=%d->",data[var]);

    中断;

    案例4://IBP LSB

    data[var]=x.Parameters[2];
    //显示("\nResult[var],var4=%d--->",data[var]);

    中断;

    案例5://对于键盘-寄存器01

    data[var]=0x22;//否则,如果它不会进入任何'if--else'条件,则会出现垃圾值。
    //-95=ff^ENC 键-3-4-18

    //显示("\nResult[var],var5=%d--->",data[var]);

    中断;

    案例6://键盘寄存器= 00。
    DATA[var]=0x54;
    //显示("\nResult[var],var6=%d--->",data[var]);


    中断;

    案例7://针对错误代码

    data[var]=err;
    if (data[var]!=0)

    //Display ("\n---------------------------- 来了--- ERR=%x\n",data[var]);
    //Display (("\n、--err=dec =%d\n"、data[var]);

    //显示("\nResult[var],var7=%d--->",data[var]);

    ERR=0;
    中断;

    情况8://表示序列号

    data[var]=seq;


    SEQ++;//它将从0变为124
    if (seq=125)

    SEQ=0;

    //显示("\nResult[var],var8=%d--->",data[var]);

    中断;

    案例9://用于校验和。

    DATA[var]=0x55;

    //显示("\nResult[var],var9=%d--->",data[var]);

    for (crc_i=0;crc_i<9;crc_i++)//而不是9、因为不包含用于 CRC 计算的此 CRC 字节。仅限之前的8个字节

    crc=crc+data[crc_i];

    if (CRC > 255)//参考软件文档以进行 forumla 计算

    crc1=crc/256;
    crc1=crc1*256;
    crc=crc-crc1;
    data[var]=crc;
    //Display ("\nResult[var]=%d\n"、data[var]);

    其他

    data[var]=crc;

    中断;

    默认值:

    中断;

    //Display (("\nresult--[var]、var=%d->%x"、var、data[var]);


    ///-------------------- 发送到蓝牙---

    ProcessCommandLine1 (data、data_packet_size);//这在 sppdemo.c 的4307行中
    ProcessCommandLine3();

    /*********
    *函数:IBP_self_test()
    *
    *说明:这是在预热期间调用的 IBP 板的自检
    *来自 Main.c.
    *
    *参数:空
    *
    *返回:指示是否通过自检的值。
    *
    *可重入性:是。 在 self_Test 期间、直到自检完成、这将持续执行。
    *
    *执行要求/假设:空
    *
    (小部分 /


    bool IBP_self_test ()//检查 ADC 的 ID。如果 id 返回=90h、则更正 ID.so、对 IBP=ok 进行自检

    //显示("\n IBP_self_test");


    uint32_t pui32DataRx[NUM_SSI_DATA];
    SEND_DATA (ADS1248_CMD_ID);
    SEND_DATA (ADS1248_CMD_WAKEUP);
    Receive_data (2);
    //Display (("\n ------) IBP\n");
    SEND_DATA (ADS1248_CMD_NOP);
    SSIDataGet (SSI2_base、&pui32DataRx[0]);
    pui32DataRx[0]&= 0x00FF;
    //Display ("\n --IBP==== %x\n"、pui32DataRx[0]);

    if (pui32DataRx[0]= ADC_ID)

    //ErrorHandler (true,3);
    return (true);//正确

    其他

    //ErrorHandler (false,3);
    return (false);//不正常

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Jansi、

    我们不提供完整的代码审核、您发布的代码超出了论坛上以纯文本形式发布的代码。 对于大型代码文件、您需要将它们作为.c 文件附加。

    有关如何检查代码中数据的详细信息、请参阅以下有关如何在 Code Composer Studio 中观察变量和表达式的指南: https://software-dl.ti.com/ccs/esd/documents/users_guide/ccs_debug-main.html#watching-variables-expressions-and-registers

    此致、

    Ralph Jacobi