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.

[参考译文] CCS/TM4C1294NCPDT:某些 TMP006功能似乎不起作用

Guru**** 2422790 points
Other Parts Discussed in Thread: TMP006

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/612622/ccs-tm4c1294ncpdt-some-tmp006-functions-seems-not-work

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

您好!

我尝试从传感器集线器 BoosterPack 读取温度、以便在 enet_IO 示例中使用。 为此、我链接了 temperature_temp006.c 并在我的 Building Settings 中包含 TivaWare 和 Sensorlib。 但是、与温度示例相关的一些功能似乎无法正常工作。

原始文件中的 TMP006Init:

这与我的链接文件中的函数相同:

TMP006Init、TMP006AppErrorHandler、TMP006ReadModifyWrite TMP006DataTemperatureGetFloat 会发生这种情况、但其他函数也正常工作、并且在 Purpe 中。

此外、当我调试和使用一些断点时、TMP006Init 会将我驱动为:


我已经尝试解决添加 temp006.h 并复制.c 文件中的函数的问题、但这一切都奏效了。

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

    您是否在 startup_ccs.c 中设置了 I2C7矢量? 第193行:

    TMP006I2CIntHandler、 // I2C7主设备和从设备
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    要添加到 Bob 说的内容、您还需要在 startup_ccs.c 文件中包含 IntHandlerGPIOPortH。

    如果您比较两个项目的 startup_ccs.c 文件、并确保在 enet_io 项目中为 temperature_tmp006项目设置了所需的中断、则该问题应该会消失。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bob、Ralph、

    感谢您的回答。 我复制了 muy startup_css.c 文件中的外部声明、但我没有检查矢量表。 我已经在 TMP006和 SHT21示例中以及在两个正确构建的程序中尝试过这种方法。

    但是、TMP006示例给出了错误的测量方法。 虽然 SHT21的温度测量值大约为30-31度、但 TMP006是5.0、即使我使用了热源、也没有变化。

    这可能是传感器问题、还是 I2C 问题?

    谢谢、此致、
    内雷阿罗德拉
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nerea、

    如果您使用 TivaWare 提供的 TMP006示例、温度读数是否正确? 如果是这样、我怀疑您将这两个项目组合在一起时仍然存在问题。 这是找出传感器或 I2C 问题的最快方法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    很抱歉耽误你的回答。 我一直在尝试对项目进行一些更改以找出问题、我意识到、当我将 Enet_IO 和 TMP006示例结合使用时、没有问题。 但是、当我将示例修改为仅执行一次(通过软件触发器)而不是执行令人反感的操作(我删除 while (1)或移动某些函数)时、我会得到错误的措施。 光传感器同样存在问题。 但是、湿度传感器一直工作正常、并报告正确的测量值。

    传感器之间可能存在某种 I2C 干扰?

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

    您好、Nerea、

    发布导致错误测量的代码更改。 尝试使用本文档指南调试 IntDefaultHandler()。    

    -克尔

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

    尊敬的 Markel:

    我曾尝试遵循该文档指南、但没有获得任何结果。 我发现、当我尝试使用多个传感器时、例如来自传感器集线器 BoosterPack 的光、温度和湿度、它们之间存在某种"干扰"。 我已经解决了这一问题、在任务结束之前调用下一个传感器任务。 温度和湿度现在可以正常工作、我只采取了一些错误的测量方法、或者根本没有测量方法、但当我断开并重新连接电路板时、它是固定的。

    现在唯一的问题是光传感器。 我像其他代码一样修改了代码、擦除 while (1)和 UARTprintf、并将函数从 int main 更改为 void lIGHT_task。 这里唯一的区别是 SysTickIntHandler (void)中断、该中断由于 enet_io 文件中有其他声明的执行其他操作而呈现了一致。 我的解决方案是对光传感器文件中的这种中断进行注释、并添加了 DataRead 函数、该函数以前是中断中的"main"、但它不起作用。

    代码如下:

    //
    
    #include 
    #include 
    #include "inc/hw_memmap.h"
    #include "inc/hw_ints.h"
    #include "driverlib/debug.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/pin_map.h"
    #include "drivers/包含"drivers/drivers/driversnecnes/sensorlib.h"
    
    #include "drivers/intrl.mdio.hw_util.h"#include "#include "#include
    
    
    
    "drivers/包含"#drivers.status.lib.mdio.mdio.mdio.md.md.hw_modules/#include #include "#include "#include "#"#include "#.status.status.lib
    
    
    
    
    
    //
    //! \addtogroup example_list
    //! 

    使用 ISL29023进行光测量(LIGHT_ISL29023)

    //! //! 此示例演示了传感器库 TM4C1294 的基本用法//! 已连接 LaunchPad 和 SensHub BoosterPack 以获取环境和 //! 使用 ISL29023传感器进行红外光测量。 //! //! SensHub BoosterPack 必须安装在 BoosterPack 1接口上。 //! 有关使用 BoosterPack 2接口所需的更改、请参阅代码注释。 //! //! 将串行终端程序连接到 LaunchPad 的 ICDI 虚拟串行 //! 波特率为115、200波特。 每字节使用8位、无奇偶校验和1个停止位。 //! 原始传感器测量值打印到终端。 LED 在 //!处闪烁 初始化完成且示例正在运行后为1Hz。 //! //! 当 //! 强度达到电流范围设置内的最小或最大阈值。 //! //// ***************** // // //定义 ISL29023 I2C 地址。 //// ***************** #define ISL29023_I2C_ADDRESS 0x44 //********* // //系统节拍率表示为节拍/秒和一毫秒 //周期。 //// ***************** #define SYSTICKS_PER_second 1 #define SysTick _PERIOD_MS (1000 / SYSTICKS_PER_second) //********* // //用于存储实际系统时钟频率的全局变量。 //// ***************** uint32_t g_ui32SysClock; //********* // // I2C 主驱动程序的全局实例结构。 //// ***************** extern tI2CMInstance g_sI2CInst; //********* // // ISL29023传感器驱动程序的全局实例结构。 //// ***************** tISL29023 g_sISL29023Inst; //********* // //全局标志,用于警告 main ISL29023数据已就绪或 发生错误//。 //// ***************** volatile unsigned long g_vui8DataFlag; volatile unsigned long g_vui8ErrorFlag; volatile unsigned long g_vui8IntensityFlag; //*************** // //常量,用于保存每个 //范围设置的浮点版本的阈值。 数字表示81%和19%的阈值水平。 此 //在距离调整之间创建+/- 1%的滞环。 //// ***************** const float g_fThresholdHigh[4]= { 810.0f、3240.0f、12960.0f、64000.0f }; const float g_fThresholdLow[4]= { 0.0f、760.0f、3040.0f、12160.0f }; //********* // //如果驱动程序库遇到错误,则调用的错误例程。 //// ***************** #ifdef debug void __error__(char *dpcFilename、uint32_t ui32Line) { #endif //********* // // ISL29023传感器回调函数。 ISL29023传感器 //驱动器事务结束时调用。 这是从 I2C 中断上下文中调用的。 因此、 //我们只需设置一个标志、让 main 执行大量计算和显示。 //// ***************** void ISL29023AppCallback (void *pvCallbackData、uint_fast8_t ui8Status) { // //清除 LED 以显示读取已完成。 // ////LEDWrite (CLP_D3 | CLP_D4、0); // 如果事务成功,请将数据标志设置为 //应用程序,指示此事务已完成,数据可能已就绪。 // if (ui8Status == I2CM_STATUS_SUCCESS) { g_vui8DataFlag = 1; } // //在出现错误情况时存储最新状态 // g_vui8ErrorFlag = ui8Status; } //************* // //// NVIC 由于 I2C7中断而调用。 I2C7是到 ISL29023的 I2C 连接//。 // //要使用 BoosterPack 2接口,请更改启动文件,将此 //函数安装到 I2C8中断矢量位置。 //// ***************** void ISL29023I2CIntHandler (void) { // //传递到传感器库提供的 I2CM 中断处理程序。 //需要在应用程序级别这样 I2CMIntHandler 才能 //接收实例结构指针作为参数。 // I2CMIntHandler (&g_sI2CInst); } //********* // //// NVIC 由于 GPIO 端口 E 中断事件调用。 对于这个 //应用程序、GPIO 端口 E 引脚5是 ISL29023的中断线 // 对于这个应用程序、这是一个极低优先级的中断、我们希望 //获得超出阈值的光值通知、但它不是 //最重要的事情。 //// ***************** void GPIOPortEIntHandler (void) { unsigned long ulStatus; ulStatus = GPIOIntStatus (GPIO_Porte _BASE、TRUE); // 清除设置 的所有引脚中断// GPIOIntClear (GPIO_Porte _BASE、ulStatus); if (ulStatus & GPIO_PIN_5) { // ISL29023已指示光照级别已超出 了// INT_LT 和 INT_HT 寄存器中设置的强度阈值级别。 // g_vui8IntensityFlag = 1; } // ********* // //系统节拍计数器的中断处理程序。 //// ***************** /*void SysTickIntHandler (void) { // GO 从传感器获取最新数据。 // ISL29023DataRead (&g_sISL29023Inst、ISL29023AppCallback、&g_sISL29023Inst); } *// ********* // // ISL29023应用程序错误处理程序。 //// ***************** void ISL29023AppErrorHandler (char *pcFilename、uint_fast32_t ui32Line) { // 关闭 SysTick 以防止它请求额外的读取。 // rom_SysTickDisable (); while (1) { // 不执行任何操作 // rom_SysCtlDelay (g_ui32SysClock /(10 * 3)); } //********* // //等待 ISL29023事务完成的函数。 //// ***************** void ISL29023AppI2CWait (char *pcFilename、uint_fast32_t ui32Line) { // 在等待 I2C 驱动 程序//指示事务已完成时将处理器置于睡眠状态。 // while ((g_vui8DataFlag =0)&&(g_vui8ErrorFlag =0) { // 不执行任何操作 // } // ////如果发生错误,立即调用错误处理程序。 // if (g_vui8ErrorFlag) { ISL29023AppErrorHandler (pcFilename、ui32Line); } // 清除数据标志以供下次使用。 // g_vui8DataFlag = 0; } //********* // //强度和距离跟踪功能。 这会 根据需要调整范围和中断//阈值。 使用80/20规则。 如果光线较亮、则为 该范围内最大值的80%、然后转到下一个范围。 如果该 范围内的//电位值小于20%、则下一个范围向下。 //// ***************** void ISL29023AppAdjuststRange (tISL29023 *pInst) { fAmbient; uint8_t ui8NewRange; ui8NewRange = g_sISL29023Inst.ui8Range; // 获取最新光源数据的本地浮点副本 // ISL29023NewRange = g_sISL29023Inst.ui8Range;//获取最新光 源 数据的本地浮点副本// IsleDataFlature/Visible/ VisibleCheck/Visio&f 阈值上限值(&Q)。 // if (fAmbient > g_fThresholdHigh[g_sISL29023Inst.ui8Range]) { // 当前强度超过我们的阈值、因此调整范围 //相应 地// if (g_sISL29023Inst.ui8 范围< ISL29023_CMD_II = ui298K + ui28K 范围 } } // //检查我们是否越过了下限阈值 // if (fAmbient < g_fThresholdLow[g_sISL29023Inst.ui8Range]) { // 如果可能,转到下一个下限范围设置并重新配置 //阈值。 // if (g_sISL29023Inst.ui8范围> ISL29023_CMD_II_RANGE_1K) { ui8NewRange = g_sISL29023Inst.ui8Range - 1; } // 如果所需范围值发生更改,则将新范围发送到传感器 // if (iISL29023Inst.ui823N)、iLS29023InRange = 1;}//如果 i229023In_i2024_i2024_i_i_i20i2024_i20i20i20i20i20i20i_i20i20i20i20i20i20i20i20i20i_i20i20i20i20i20i20i20i20i20i_i_i20i20i20i20i20i20i20i20i_ ~ &sISL29023Inst); // 等待事务完成 // ISL29023AppI2CWait (__file__、__line__); } //********* // ////主"C"语言入口点。 //// ***************** extern Int32_t Light_IntegerPart; extern Int32_t Light_FractionPart; void light_task (void) { fAmbient float; int32_t i32IntegerPart、i32FractionPart; uint8_t ui8Mask; // 配置系统频率。 // g_ui32SysClock = map_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); // 为此板配置器件引脚。 //此应用程序不使用以太网或 USB。 // PinoutSet (false、false); // 使用前必须启用 I2C7外设。 // //对于 BoosterPack 2接口、使用 I2C8。 // ROM_SysCtlPeripheralEnable (SYSCTL_Periph_I2C7); ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); // 为端口 D0和 D1上的 I2C7功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // //对于 BoosterPack 2接口、使用 PA2和 PA3。 // ROM_GPIOPinConfigure (GPIO_PD0_I2C7SCL); ROM_GPIOPinConfigure (GPIO_PD1_I2C7SDA); // 为这些引脚选择 I2C 功能。 此函数还将 //为 I2C 操作配置 GPIO 引脚、将它们设置为 //使用弱上拉操作进行开漏操作。 请参阅数据表 //以查看每个引脚分配了哪些功能。 // //对于 BoosterPack 2接口、使用 PA2和 PA3。 // GPIOPinTypeI2CSCL (GPIO_PORTD_base、GPIO_PIN_0); ROM_GPIOPinTypeI2C (GPIO_PORTD_base、GPIO_PIN_1); // 配置和启用 GPIO 中断。 用于来自 // ISL29023 // ROM_GPIOPinTypeGPIOInput (GPIO_Porte _BASE、GPIO_PIN_5)的 INT 信号; GPIOIntEnable (GPIO_Porte _BASE、GPIO_PIN_5); ROM_GPIOIntTypeSet (GPIO_Porte _BASE、 GPIO_PIN_5、GPIO_FALLING_EDGE); ROM_IntEnable (INT_GPIOE); // //仅使系统的某些部分在睡眠模式下运行。 // GPIOE 用于 ISL29023中断引脚。 // UART0是虚拟串行端口 // I2C7是到 ISL29023的 I2C 接口 // //对于 BoosterPack 2,将其更改为 I2C8。 // ROM_SysCtlPeripheralClockGating (真); ROM_SysCtlPeripheralSleep Enable (SYSCTL_Periph_GPIOE); ROM_SysCtlPeripheralSleep Enable (SYSCTL_Periph_UART0); ROM_SysCtlPeripheralSleep Enable (SYSCTL_Periph_I2C7); 所需中断优先级/配置。 将 I2C 中断设置 为//比 SysTick 更优先、GPIO 中断意味着这些 //中断例程可以使用 I2CM_DRV 应用上下文不使用 // I2CM_DRV API、GPIO 和 SysTick 处于相同的优先级。 此 //可防止 I2CM_DRV 出现可重入性问题,但尽可能使 MCU 保持睡眠 //状态。 UART 至少具有优先级、因此它可以在 后台运行//。 // //对于 BoosterPack 2、使用 I2C8。 // ROM_IntPrioritySet (INT_I2C7、0x00); ROM_IntPrioritySet (FAULT_SysTick、0x40); ROM_IntPrioritySet (INT_GPIOE、 0x80); ROM_IntPrioritySet (INT_UART0、0x80); // //启用到处理器的中断。 // ROM_IntMasterEnable(); // 初始化 I2C7外设。 // //对于 BoosterPack 2、使用 I2C8。 // I2CMInit (&g_sI2CInst、I2C2_base、INT_I2C7、0xff、0xff、 G_ui32SysClock); // //初始化 ISL29023驱动程序。 // ISL29023Init (&g_sISL29023Inst、&g_sI2CInst、ISL29023_I2C_address、 ISL29023AppCallback、&g_sISL29023Inst); // //等待事务完成 // ISL29023AppI2CWait (__file__,__line__); // 配置 ISL29023以连续测量环境光。 在 INT 引脚被置为有效前、设定一个8 //样本持久性。 清除 INT 标志。 //持久性设置为8足以忽略相机闪烁。 // ui8Mask =(ISL29023_CMD_I_OP_MODE_M | ISL29023_CMD_I_INT_SLD_M | ISL29023_CMD_I_INT_FLAG_M); ISL29023ReadModifyWrite (&G) ISL29023Inst、ISL29023_I INT_ISL023、 ISL023_IM_I ~ I INT_ISL023_IM_I、ISL023_INT_INT_INT_ISL023_INT_INT_ISL023) ISL29023AppCallback、&g_sISL29023Inst); // 等待事务完成 // ISL29023AppI2CWait (__file____line__); // 将上限阈值配置为最大值的80% // g_sISL29023Init (__ISL29223Int = 0xISL298INT_ISL2c.Int ;isL29023Int = ISL2Int = 0xISL290232Int = ISL2LS_ISL2Int;is023Int = ISL2INSD_ISL2INSD_ISL298INSD_I2INSD_I2[ISL2INSD_INSD_INSD_INSD_INSD_INSD_INSD.ISL2[ISL290_ 2、ISL29023AppCallback、 &g_sISL29023Inst); // //等待事务完成 // ISL29023AppI2CWait (__file____line__); // 将下限阈值配置为最大值的20% // g_sISL290233_iLSB = 0x2902324_Inst ;is02324_i20_i20_i20_isLSB = ISL024_Int = IS24_is0_Int = is02324_i20_i20_is0_Int;is0_i20_i20_i20_is02324_is0_is0_i20_Int = IS24_is0_i20_inu.inst_i20_i20_i20_i20_i20_is0 2、ISL29023AppCallback、 &g_sISL29023Inst); // //等待事务完成 // ISL29023AppI2CWait (_file__、__line__); // 配置并启用 SysTick Timer// ROM_SysTickSet (g_u223_AppClock );//从 ISL2902320/ iStin/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/i20in/in/in/i20in/i20in/in/i20in/i20in/ // ROM_SysCtlSlep(); // //等待 DataRead 完成时设置的 DataFlag。 // DataRead 在 SysTick 中断处理程序中启动。 if (g_vui8DataFlag) { g_vui8DataFlag = 0; // 获取最新光数据的本地浮点副本 // ISL29023DataLightVisibleActionGetFloat (&g_sISL29023Inst、&fAmbient); // 执行从浮点到环境整数的转换(* 32) *(32)*可打印部分= 100iIntegraPart 32f (32);*(32) if (i32FractionPart < 0) { i32FractionPart *=-1; } // //将温度打印为整数和分数部分。 // UARTprintf ("visible Lux:%3d.%03d\n"、i32IntegerPart、 i32FractionPart"); // 检查光强度是否已超过阈值。 如果是、 //然后调整传感器读数范围以跟踪强度。 // if (g_vui8IntensityFlag) { // 禁用低优先级中断、仅使 能 I2C //中断。 // rom_IntPriorityMaskSet (0x40); // 重置强度触发标志。 // g_vui8IntensityFlag = 0; // 调整 lux 范围。 // ISL29023AppAdjustRange (&g_sISL29023Inst); // 现在必须手动清除 ISL29023 寄存器中的标志//。 // ISL29023Read (&g_sISL29023Inst、ISL29023_O_CMD_I、 g_sISL29023Inst.pui8Data、1、ISL29023AppCallback、 &g_sISL29023Inst); // 等待事务完成 // ISL29023AppI2CWait (__file__、__line__); // 禁用优先级屏蔽,以便启用所有中断。 // ROM_IntPriorityMaskSet (0); } } }


    谢谢、