主题中讨论的其他器件:ADS1248
您好!
我正在使用 TM4C129XNZAD 微控制器、从该项目开始、我需要将一些实时数据传输到表通信。 对于实时数据传输、我正在使用 IBP 仿真器。因此、我不知道仿真器数据是如何存储的以及数据存储的变量。 另外、请告诉我如何检查数据包。 我将在下面的附件中共享代码。 任何人都请帮助我检查数据包和仿真器变量。
代码如下所示、
[由于尺寸过大而删除代码]
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.
您好!
我正在使用 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