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.

[参考译文] TMS320F28379D:使用 tmp1075配置 I2C

Guru**** 1782690 points
Other Parts Discussed in Thread: TMP1075, TMP175
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1066397/tms320f28379d-configuring-i2c-with-a-tmp1075

部件号:TMS320F28379D
“线程”中讨论的其它部件:TMP1075TMP175测试

您好,

我一直在用一个 tmp1075来让 I2C 正常运行的墙上敲打着我的头。 我从 TI 示例 I2C_Ex5_MASTER_SLAVE_INTERRUPT 开始,开发了以下代码,这些代码在某种程度上奏效:

//########################################################
//
//文件:I2C_TMP1075.c
//
//标题:I2C 设置并接收来自 TMP1075/TMP175设备的温度值
//
//! 使用 driverib 函数,并且非常松散地基于 TI 演示代码 i2c_Ex5_MASTER_SLAVE_INTERRUPT
//!
//! 该程序使用 I2CA 模块实现外部
//! 来自 TMP1075的数据。 I2CA RX FIFO 与一起使用
//! 中断。 它可以工作,但需要进一步的工作。
//!
//! 设备延迟功能的使用与实时操作不兼容.....
//!
//! 设备最初配置为接收正确的温度值
//! 由于当前延迟在代码中处于联机状态,因此需要对时间和顺序进行正确排序,以确保 I2C 有时间发送
//! 获得这些值后,芯片的温度转换时间约为220毫秒,目前,如果延迟设置为< 30毫秒
//! 设备似乎已锁定,数据表指定的超时为20毫秒左右,这可能是此处所看到的
//! 存储的温度值可以在大约1/30毫秒的时间读取,但只能在1/220毫秒的时间内进行内部更新
//!
//! 必须使用一些更好的 I2C 握手技术,但目前还没有找到正确的方法。
//! 读取温度的顺序是传输一个指针代码00,然后切换到接收模式并在之后触发启动
//! 温度传感器将发送触发中断的数据

//! 建议使用计时器嵌入此代码以触发正确的 I2C 序列,并留出时间让设备做好响应准备


//########################################################
//仅用于硬件测试
//监视变量 RDATA,temp,fiforx,F,result, Example_Passcount
//注意,example_PassCount 应该是 fifforx 的两倍,如果它工作正常,但它是 fifforx 的四倍,不清楚为什么...

//$
//########################################################

//
//包含的文件
//
#include "driverlib.h"
#include "device.h"

//
//定义
//
#define slave 地址0x48
#define pointer_TEMP 0x00
#define pointer_config 0x01
#define pointer_Tlow 0x02
#define pointer_大腿0x03

//TMP175设置配置:
#define TMP175_config 0x68
//D7-一次激发-0-连续转换。
//D6,D5 -分辨率-全12位分辨率11 (220ms 转换时间)
//D4,D3 -噪声滤波器-跳闸01连续出现2个故障
//D2 - Polatiry -活动低0
//D1 - TM -比较器模式0
//D0 - SD -连续转换0
#define TMP175_Tlow 0x68
#define TMP175_大腿0x68

//
//全球
//

UINT16_t RDATA[2]={0};//接收数据缓冲区
UINT16_t rDataPoint =0;//跟踪我们在中的位置
//数据流以检查接收到的数据
内部结果= 0;//temp 结果
浮动温度= 0;//转换结果
INT F = 0;//测试值
内菲弗克斯=0;
//
//函数原型
//
ininitI2CFIFO(void);
使 initTMP1075无效(void);
中断 void i2cFIFO ISR(void);

//
//主页
//
主无效(无效)

UINT16_t i;

//
//初始化设备时钟和外围设备
//
device_init();

//
//禁用引脚锁定并启用内部上拉。
//
device_initGPIO ();

//
//初始化 GPIOs 91和92,分别用作 SDA 和 SCL A
//
GPIO 设置引脚配置(GPIO_91_SDAA);
GPIO 设置 PadConfig(91,GPIO 引脚类型上拉);
GPIO 设置限定模式(91,GPIO Qual_Async);

GPIO 设置引脚配置(GPIO_92_SCLA);
GPIO 设置 PadConfig(92,GPIO 引脚_type_pullup);
GPIO 设置限定模式(92,GPIO Qual_Async);

//
//将 GPIO 93初始化为 GPIO 以发出警报
//
GPIO 设置引脚配置(GPIO_93_GPIO93);
GPIO 设置 PadConfig(93,GPIO 引脚_type_pullup);
GPIO 设置限定模式(93,GPIO Qual_Async);
//
//将 GPIO 31初始化为 LED 的 GPIO
//
GPIO 设置 PadConfig (device_GPIO _PIN_LED1,GPIO _PIN_TYPE_STD);
GPIO 设置导向模式(device_GPIO _PIN_LED1,GPIO _DIR_MODE_OUT);
//
//将 GPIO 34初始化为 LED 的 GPIO
//
GPIO 设置 PadConfig (device_GPIO _PIN_LED2,GPIO _PIN_TYPE_STD);
GPIO 设置导向模式(device_GPIO _PIN_LED2,GPIO _DIR_MODE_OUT);
//
//初始化饼图并清除饼图寄存器。 禁用 CPU 中断。
//
interrup_initModule();

//
//使用指向 shell Interrupt 的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
interrup_initVectorTable();

//
//本示例中使用的中断将重新映射到 ISR 功能
//在此文件中找到。
//
中断寄存器(INT_I2CA_FIFO,&i2cFIFO;
//
//设置 I2C 使用,将其初始化为 FIFO 模式
//
initI2CFIFO();

//
//初始化数据缓冲区
//
对于(i = 0;i < 2;I++)

RDATA[I]= 0;
}


//
//启用此示例所需的中断
//
Interrup_enable (INT_I2CA_FIFO);
//
//启用全局中断(INTM)和实时中断(DBGM)
//
EINT;
ERTM;

initTMP1075();//设置 TMP1075

//
//永远循环。 暂停或放置断点以观察缓冲区。
//
While (1)(同时)

//将为每个基于 Rx 的 Rx 生成 FIFO 中断
//两个字节到达时。
//这里的想法是第一个设定指针的路径和第二个读取温度的路径,

GPIO 写入引脚(device_GPIO _PIN_LED1,0);//打开 LED1
GPIO 写入引脚(device_GPIO _PIN_LED2,0);//打开 LED2
Example_PassCount++;

如果(F=0)为{
I2C_setConfig (I2CA_BASE,I2C_MASTER_SEND_MODE);

I2C_SendStartCondition (I2CA_BUS);//发送配置
I2C_PUData (I2CA_BASE,0x00);//将 TMP175指针设置为读取温度
F=1;
}
否则

//
//延迟。
//device_delay_US (2000);//从主发送模式切换到主接收模式时,似乎需要这种方法来避免锁定

GPIO 写入引脚(device_GPIO _PIN_LED2,1);//关闭 LED2

I2C_setConfig (I2CA_BASE,I2C_MASTER_receive_mode);//
I2C_SendStartCondition (I2CA_base);//发送读取开始
F=0;
}

DEVICE_DELAY _US (50000);//如果这小于30000,设备将锁定(怀疑 Ttimout 是这里的罪魁祸首)


}
}

//
//在 FIFO 模式下配置 I2C A 的功能。
//
ininitI2CFIFO()无效

//
//必须在配置 I2C 之前重置 I2C
//
I2C_disableModule (I2CA_BASE);

//
// I2C 配置。 使用工作周期为50%的400kHz I2CCLK。
//
I2C_INITMaster (I2CA_BASE,DEVICE_SYSCLK_FREQ,200000,I2C_DUTYCYCLE_50);
I2C_setConfig (I2CA_BASE,I2C_MASTER_SEND_MODE);

//I2C_setDataCount (I2CA_BASE,1);
I2C_setDataCount (I2CA_BASE,2);
I2C_setBitCount (I2CA_BASE,I2C_BICOUNT_8);

//
//配置温度传感器
//
I2C_setSlaveAddress (I2CA_BASE,从属地址);
I2C_setEmulationMode (I2CA_BASE,I2C_Emulation_free 运行);

//
// FIFO 和中断配置
//
I2C_enableFIFO (I2CA_BASE);
I2C_ClearInterruptStatus (I2CA_BASE,I2C_INT_TXFF);
I2C_ClearInterruptStatus (I2CA_BASE,I2C_INT_RXFF);

//
//传输 FIFO 中断级别设置为生成中断
//当16字节 TX fifo 包含2个或更小字节的数据时。
//
I2C_SET FIFO InterruptLevel (I2CA_BASE,I2C_FIF_TX2,I2C_FIF_RX2);//当 FIFO 有两个字节时设置为中断
//
I2C_enableInterrupt (I2CA_BASE,I2C_INT_RXFF);仅限//启用 RX 中断
//
//配置完成。 启用模块。
//
I2C_enableModule (I2CA_BASE);
}

//
// I2C TX 和设置 TMP1075
//
inittMP1075()无效

//设置 TMP175配置寄存器
I2C_setConfig (I2CA_BASE,I2C_MASTER_SEND_MODE);
I2C_SendStartCondition (I2CA_BUS);//发送启动配置
I2C_PUData (I2CA_BASE,POINT_CONFIG);//设置要配置的 TMP175指针
I2C_PUData (I2CA_BASE,TMP175_CONFIG);//发送配置字节
DEVICE_DELAY _US (1000);//允许配置传输的时间
I2C_SendStopCondition (I2CA_BUS);//发送停止配置

}


//
// I2C TX 和接收 FIFO ISR
//
_interrupt void i2cFIFO ISR(void)

UINT16_t i;
int a,b = 0;


//
//如果设置了接收 FIFO 中断标志,请读取数据
//
IF ((I2C_getInterruptStatus (I2CA_BASE)& I2C_INT_RXFF)!= 0)

对于(i = 0;i < 2;I++)

RDATA[i]= I2C_getData (I2CA_BASE);

}
//result =((RDATA[0]<8)|(RDATA[1]>4));

A =(int)(RDATA[0])<8);
B =(int)(RDATA[1]| A);
结果=b>>4;

//result =(RDATA[0])<8| RDATA[1]>4;
温度=((浮点)结果)* 0.0625;
//
//清除中断标志
//

I2C_ClearInterruptStatus (I2CA_BASE,I2C_INT_RXFF);

Fiforx++;

GPIO 写入引脚(device_GPIO _PIN_LED1,1);//关闭 LED1
}

//
//发出 ACK
//
interrup_clearACKGroup (interrup_ACK_group8);
}

//
//文件结束
//

监视表达式:

将指针设置为 config 和 config word:

将指针设置为临时:

读取温度:

该设置是使用开发工具包中的 controlCARD 和 TMP1075进行的 Heath Robinson 事件:  

因此,我并不期待完美的信号,但据我所知,设置不会导致任何随机行为,降低 I2C 比特率对代码行为没有任何影响。

此时我只需要 I2C 与一个温度传感器进行通信,因此它应该是直接的,理想情况下我会 使用异步代码进行读取,中断将在芯片就绪时处理响应, 但是,让它像这样运行似乎会给我 带来一些挑战,让我了解正确的顺序来实现它。 正如我所说,上述代码可靠地工作,但只是经过一种时尚。 它有以下问题:

1)在 I2C 启动/停止和主发送/接收模式发生变化时,它依靠处理器延迟来管理 I2C 定时,而我尝试与驱动程序库功能混淆以检查 I2C 忙碌或停止的状态,以尝试和“控制”, 迄今为止,我没有取得成功,因此欢迎就如何有效利用这些资源或如果我走上正确的道路提出任何建议。 或者,使用外部计时器对消息进行排序和主模式更改等是否是唯一的方法?  

2)您可以看到,程序中的 while 循环似乎每中断循环的次数是我预期的两倍 ,并且不知道为什么会这样。 有什么想法吗? 由于某种原因,范围上的数据明显具有以 bur 为单位发送的两个字节,FIFO 不会每次收集两个字节。 同样,欢迎提出任何建议。

此致

史蒂夫

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

    史蒂夫  

    我浏览了您的代码,并有几个问题  

    1.在 While 循环中,停止条件在哪里生成? 我看不到 正在对 I2C_SendStopCondition 发出的任何呼叫。  

    2.看起来每次在 while 循环中启动条件都被调用。  顺序应为“开始条件,从属地址,n 个数据字节,停止条件”

    此致

    西达尔斯  

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

    您好,Siddharth,

    在这个版本中,代码中没有 I2C_sendStopConditon,尽管在我尝试使用它并安装了其他版本的时候,如果你认为这是个问题,我可以重试它。 我在上载该版本之前已整理好该版本,但 在过去几周里,我一直在与许多评论相关的行发生混淆。 我希望我没有忽略一些简单的东西,但通常发生的是代码完全停止工作,设备停止发送温度值。 根据数据表,在温度读取过程中,直到收到数据后,主控制器才会停止工作:

    我确实尝试将此 I2C_sendStopConditon  放在中断例程中,但这似乎也不起作用

    我通常会在最后一个场景中看到 TMP1075只是不想玩。 如果有人对 TMP 1075或 TMP 175有一些演示代码会有帮助,我已经经历了许多代码排列? 举例来说,这是另一个我试图使用 FIFO 发送和接收中断,扭曲和所有这些根本不起作用的版本...

    //########################################################
    //
    //文件:I2C_ex3_external_loopback.c
    //
    //标题:具有 FIFO 中断的 I2C 数字外部环回
    //
    //! \addtogroup driver_example_list
    //! 具有 FIFO 中断的<H1>I2C 数字外部环回</H1>
    //!
    //! 本计划使用 I2CA 和 I2CB 模块实现外部
    //! 环回。 I2CA TX FIFO 和 I2CB RX FIFO 与一起使用
    //! 它们的中断。
    //!
    //! 在 I2CA 上发送数据流,然后与接收到的数据流进行比较
    //! 在 I2CB 上。
    //! 发送的数据如下所示:\n
    //! 0000 0001 \n
    //! 0001 0002 \n
    //! 0002 0003 \n
    //! ... \n
    //! 00FE 00FF \n
    //! 00FF 0000 \n
    //! 等等。 \n
    //! 这种模式是永远重复的。
    //!
    //! b 外部连接\n
    //! -将 SCLA (GPIO33)连接到 SCLB (GPIO35)和 SDAA (GPIO32)连接到 SDAB (GPIO34)
    //! -将 GPIO31连接到用于描述数据传输的 LED。
    //!
    //! b 监视变量\n
    //! -\sData -要发送的数据
    //! -/b RDATA -已接收数据
    //! -/b rDataPoint -用于跟踪接收中的最后一个位置
    //! 用于错误检查的流
    //!
    //
    //########################################################
    //$TI 版本:F2837xD 支持库 v3.12.00.00 $
    //$Release Date:星期五2月12日19:03:23 IST 2021 $
    //$版权:
    //版权所有(C) 2013-2021德州仪器(TI)公司- http://www.ti.com/
    //
    //以源代码和二进制格式重新分发和使用,无论是否
    //修改,只要符合以下条件即可
    //符合:
    //
    //重新分发源代码必须保留上述版权
    //通知,此条件列表和以下免责声明。
    //
    //二进制形式的再发行必须复制上述版权
    //通知,此条件列表和中的以下免责声明
    //随提供的文档和/或其他材料
    //分布。
    //
    //德州仪器(TI)公司的名称和的名称都不相同
    //其贡献者可用于背书或推广衍生产品
    //未经事先书面许可,从该软件获得。
    //
    //本软件由版权所有者和贡献者提供
    //“原样”和任何明示或暗示的担保,包括但不包括
    //限于对适销性和适用性的暗示保证
    //没有特定目的。 在任何情况下,版权均不受限制
    //所有者或贡献者应对任何直接,间接,偶然,
    //特殊,模范或后果性损害(包括但不包括)
    //仅限于采购替代货物或服务;不使用,
    //数据或利润;或业务中断)
    //责任理论,无论是在合同中,严格责任还是侵权行为中
    //(包括疏忽或其他)因使用而产生的任何形式
    //,即使被告知可能会造成此类损坏,也是如此。
    //$
    //########################################################

    //
    //包含的文件
    //
    #include "driverlib.h"
    #include "device.h"

    //
    //定义
    //
    #define slave 地址0x48
    #define pointer_TEMP 0x00
    #define pointer_config 0x01
    #define pointer_Tlow 0x02
    #define pointer_大腿0x03
    //TMP175设置配置:
    #define TMP175_config 0x68
    //D7-一次拍摄-0
    //D6,D5 -分辨率-全12位分辨率11.
    //D4,D3 -噪声滤波器-跳闸01连续出现2个故障
    //D2 - Polatiry -活动低0
    //D1 - TM -比较器模式0
    //D0 - SD -连续转换0
    #define TMP175_Tlow 0x68
    #define TMP175_thogh 0x68

    //
    //全球
    //
    UINT32_t Fiforx = 0;
    UINT32_t Fifotx = 0;

    UINT16_t sData[2]={0};//发送数据缓冲区
    UINT16_t RDATA[2]={0};//接收数据缓冲区
    UINT16_t rDataPoint =0;//跟踪我们在中的位置
    //数据流以检查接收到的数据
    内部结果= 0;//temp 结果
    浮动温度= 0;
    int j = 0;//测试值
    内部 F,G,H = 0;
    内部步骤=0;
    //
    //函数原型
    //
    ininitI2CFIFO(void);
    使 initTMP1075无效(void);
    中断 void i2cFIFO ISR(void);

    //
    //主页
    //
    主无效(无效)

    UINT16_t i;

    //
    //初始化设备时钟和外围设备
    //
    device_init();

    //
    //禁用引脚锁定并启用内部上拉。
    //
    device_initGPIO ();

    //
    //初始化 GPIOs 91和92,分别用作 SDA 和 SCL A
    //
    GPIO 设置引脚配置(GPIO_91_SDAA);
    GPIO 设置 PadConfig(91,GPIO 引脚类型上拉);
    GPIO 设置限定模式(91,GPIO Qual_Async);

    GPIO 设置引脚配置(GPIO_92_SCLA);
    GPIO 设置 PadConfig(92,GPIO 引脚_type_pullup);
    GPIO 设置限定模式(92,GPIO Qual_Async);

    //
    //将 GPIO 93初始化为 GPIO 以发出警报
    //
    GPIO 设置引脚配置(GPIO_93_GPIO93);
    GPIO 设置 PadConfig(93,GPIO 引脚_type_pullup);
    GPIO 设置限定模式(93,GPIO Qual_Async);
    //
    //将 GPIO 31初始化为 LED 的 GPIO
    //
    GPIO 设置 PadConfig (device_GPIO _PIN_LED1,GPIO _PIN_TYPE_STD);
    GPIO 设置导向模式(device_GPIO _PIN_LED1,GPIO _DIR_MODE_OUT);
    //
    //将 GPIO 34初始化为 LED 的 GPIO
    //
    GPIO 设置 PadConfig (device_GPIO _PIN_LED2,GPIO _PIN_TYPE_STD);
    GPIO 设置导向模式(device_GPIO _PIN_LED2,GPIO _DIR_MODE_OUT);
    //
    //初始化饼图并清除饼图寄存器。 禁用 CPU 中断。
    //
    interrup_initModule();

    //
    //使用指向 shell Interrupt 的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //
    interrup_initVectorTable();

    //
    //本示例中使用的中断将重新映射到 ISR 功能
    //在此文件中找到。
    //
    中断寄存器(INT_I2CA_FIFO,&i2cFIFO;
    //
    //设置 I2C 使用,将其初始化为 FIFO 模式
    //
    //initTMP1075();//设置 TMP1075
    //测试

    initI2CFIFO();

    //
    //初始化数据缓冲区
    //
    对于(i = 0;i < 2;I++)

    sData[i]= 0;
    RDATA[I]= 0;
    }


    //
    //启用此示例所需的中断
    //
    Interrup_enable (INT_I2CA_FIFO);
    //
    //启用全局中断(INTM)和实时中断(DBGM)
    //
    EINT;
    ERTM;

    initTMP1075();//设置 TMP1075

    //
    //永远循环。 暂停或放置断点以观察缓冲区。
    //
    While (1)(同时)

    //将为每个基于 Tx 和 Rx 的 Tx 生成 FIFO 中断
    //配置的中断级别。
    // ISR 将处理向/从 TX 和中推送/拉数据的问题
    // RX FIFO 或
    GPIO 写入引脚(device_GPIO _PIN_LED2,1);//关闭 LED2
    //device_delay_US (200);
    //
    //延迟。
    //
    温度=((浮点)结果)* 0.0625;

    DEVICE_DELAY _US (50000);

    开关(步骤)

    案例0:
    步骤= 1;
    //将温度传感器参数设置为读取温度
    I2C_setConfig (I2CA_BASE,I2C_MASTER_SEND_MODE);
    I2C_PUData (I2CA_BASE,0x00);//将 TMP175指针设置为读取温度
    I2C_PUData (I2CA_BASE,0x00);//将 TMP175指针设置为读取温度
    I2C_SendStartCondition (I2CA_BUS);//发送配置
    //device_delay_US (200);
    I2C_ClearInterruptStatus (I2CA_BASE,I2C_INT_TXFF | I2C_INT_RXFF);
    I2C_enableInterrupt (I2CA_BASE,I2C_INT_TXFF | I2C_INT_RXFF);
    休息;
    案例1:
    //读取温度
    I2C_SendStartCondition (I2CA_BUS);//发送配置
    G+=1;//增量计数器
    休息;
    }

    GPIO 写入引脚(device_GPIO _PIN_LED1,0);//打开 LED1

    }

    }//主页的末尾

    //
    //在 FIFO 模式下配置 I2C A 的功能。
    //
    ininitI2CFIFO()无效

    //
    //必须在配置 I2C 之前重置 I2C
    //
    I2C_disableModule (I2CA_BASE);

    //
    // I2C 配置。 使用工作周期为50%的400kHz I2CCLK。
    //
    I2C_INITMaster (I2CA_BASE,DEVICE_SYSCLK_FREQ,200000,I2C_DUTYCYCLE_50);
    I2C_setConfig (I2CA_BASE,I2C_MASTER_SEND_MODE);

    //I2C_setDataCount (I2CA_BASE,1);
    I2C_setDataCount (I2CA_BASE,2);
    I2C_setBitCount (I2CA_BASE,I2C_BICOUNT_8);

    //
    //配置温度传感器
    //
    I2C_setSlaveAddress (I2CA_BASE,从属地址);
    I2C_setEmulationMode (I2CA_BASE,I2C_Emulation_free 运行);

    // FIFO 和中断配置
    //
    //

    I2C_enableFIFO (I2CA_BASE);


    //
    //传输 FIFO 中断级别设置为生成中断
    //当16字节 TX fifo 包含0或更小字节的数据时,或当 RX fifo 时。
    //包含>=2字节的数据

    I2C_setFIFO InterruptLevel (I2CA_BASE,I2C_FIFO,TX2,I2C_FIFO,RX1);
    //需要确保未设置中断
    I2C_ClearInterruptStatus (I2CA_BASE,I2C_INT_TXFF);
    I2C_ClearInterruptStatus (I2CA_BASE,I2C_INT_RXFF);
    //启用中断
    //I2C_enableInterrupt (I2CA_BASE,I2C_INT_TXFF);
    //I2C_enableInterrupt (I2CA_BASE,I2C_INT_RXFF);


    //配置完成。 启用模块。
    //
    I2C_enableModule (I2CA_BASE);

    //请等待以确保重置完成,然后再继续....
    //device_delay_US (200);
    //
    }

    //
    // I2C TX 和设置 TMP1075
    //
    inittMP1075()无效


    //设置 TMP175配置寄存器
    //阻止中断
    //I2C_DisableInterrupt (I2CA_BASE,I2C_INT_TXFF | I2C_INT_RXFF);
    //I2C_setConfig (I2CA_BASE,I2C_MASTER_SEND_MODE);

    I2C_SendStartCondition (I2CA_BUS);//发送配置
    I2C_PUData (I2CA_BASE,POINT_CONFIG);//设置要配置的 TMP175指针
    I2C_PUData (I2CA_BASE,TMP175_CONFIG);//配置字节
    I2C_SendStopCondition (I2CA_BUS);//发送配置

    //I2C_ClearInterruptStatus (I2CA_BASE,I2C_INT_TXFF | I2C_INT_RXFF);
    //I2C_enableInterrupt (I2CA_BASE,I2C_INT_TXFF | I2C_INT_RXFF);

    }


    //
    // I2C TX 和接收 FIFO ISR
    //
    _interrupt void i2cFIFO ISR(void)

    UINT16_t i;


    //
    //如果设置了接收 FIFO 中断标志,请读取数据
    //
    IF ((I2C_getInterruptStatus (I2CA_BASE)& I2C_INT_RXFF)!= 0)


    I2C_sendStopCondition(I2CA_base);//将停止发送到 I2C 总线
    对于(i = 0;i < 2;I++)

    RDATA[i]= I2C_getData (I2CA_BASE);
    }

    结果=(RDATA[0]|<8|RDATA[1]>4;

    //
    //清除中断标志
    //
    步骤=0;//清除温度标志以允许另一个周期
    I2C_ClearInterruptStatus (I2CA_BASE,I2C_INT_RXFF);

    菲福克斯++;
    }
    //
    //如果设置了 Transmit FIFO interrupt (传输 FIFO 中断)标志,请将主接收模式设置为接收临时数据
    //
    否则,IF ((I2C_getInterruptStatus (I2CA_BASE)和 I2C_INT_TXFF)!= 0)


    I2C_setConfig (I2CA_BASE,I2C_MASTER_receive_mode);
    //
    //发送开始条件
    //
    I2C_SendStartCondition (I2CA_BASE);
    //step =1;//清除 temp 标志以允许另一个循环
    //
    //增加下一个周期的数据
    //
    //
    //清除中断标志
    //

    //I2C_ClearInterruptStatus (I2CA_BASE,I2C_INT_TXFF);
    //I2C_DisableInterrupt (I2CA_BASE,I2C_INT_TXFF );
    Fifotx ++;

    }


    //
    //关闭 LED 以描述数据传输
    //

    GPIO 写入引脚(device_GPIO _PIN_LED1,1);//关闭 LED1


    //
    //发出 ACK
    //
    interrup_clearACKGroup (interrup_ACK_group8);
    }

    //
    //文件结束
    //

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

    你好,Siddharth,这是我正在与之混淆的另一个版本的代码,再次尝试合并 stop 命令。 这也不起作用...

    //########################################################

    //
    //包含的文件
    //
    #include "driverlib.h"
    #include "device.h"

    //
    //定义
    //
    #define slave 地址0x48
    #define pointer_TEMP 0x00
    #define pointer_config 0x01
    #define pointer_Tlow 0x02
    #define pointer_大腿0x03
    //TMP175设置配置:
    #define TMP175_config 0x68
    //D7-一次拍摄-0
    //D6,D5 -分辨率-全12位分辨率11.
    //D4,D3 -噪声滤波器-跳闸01连续出现2个故障
    //D2 - Polatiry -活动低0
    //D1 - TM -比较器模式0
    //D0 - SD -连续转换0
    #define TMP175_Tlow 0x68
    #define TMP175_thogh 0x68

    //
    //全球
    //
    UINT16_t sData[2]={0};//发送数据缓冲区
    UINT16_t RDATA[2]={0};//接收数据缓冲区
    UINT16_t rDataPoint =0;//跟踪我们在中的位置
    //数据流以检查接收到的数据
    内部结果= 0;//temp 结果
    浮动温度= 0;
    int j = 0;//测试值
    内部 F,G,H = 0;
    内部步骤=0;
    内菲弗克斯=0;
    //
    //函数原型
    //
    ininitI2CFIFO(void);
    使 initTMP1075无效(void);
    中断 void i2cFIFO ISR(void);

    //
    //主页
    //
    主无效(无效)

    UINT16_t i;

    //
    //初始化设备时钟和外围设备
    //
    device_init();

    //
    //禁用引脚锁定并启用内部上拉。
    //
    device_initGPIO ();

    //
    //初始化 GPIOs 91和92,分别用作 SDA 和 SCL A
    //
    GPIO 设置引脚配置(GPIO_91_SDAA);
    GPIO 设置 PadConfig(91,GPIO 引脚类型上拉);
    GPIO 设置限定模式(91,GPIO Qual_Async);

    GPIO 设置引脚配置(GPIO_92_SCLA);
    GPIO 设置 PadConfig(92,GPIO 引脚_type_pullup);
    GPIO 设置限定模式(92,GPIO Qual_Async);

    //
    //将 GPIO 93初始化为 GPIO 以发出警报
    //
    GPIO 设置引脚配置(GPIO_93_GPIO93);
    GPIO 设置 PadConfig(93,GPIO 引脚_type_pullup);
    GPIO 设置限定模式(93,GPIO Qual_Async);
    //
    //将 GPIO 31初始化为 LED 的 GPIO
    //
    GPIO 设置 PadConfig (device_GPIO _PIN_LED1,GPIO _PIN_TYPE_STD);
    GPIO 设置导向模式(device_GPIO _PIN_LED1,GPIO _DIR_MODE_OUT);
    //
    //将 GPIO 34初始化为 LED 的 GPIO
    //
    GPIO 设置 PadConfig (device_GPIO _PIN_LED2,GPIO _PIN_TYPE_STD);
    GPIO 设置导向模式(device_GPIO _PIN_LED2,GPIO _DIR_MODE_OUT);
    //
    //初始化饼图并清除饼图寄存器。 禁用 CPU 中断。
    //
    interrup_initModule();

    //
    //使用指向 shell Interrupt 的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //
    interrup_initVectorTable();

    //
    //本示例中使用的中断将重新映射到 ISR 功能
    //在此文件中找到。
    //
    中断寄存器(INT_I2CA_FIFO,&i2cFIFO;
    //
    //设置 I2C 使用,将其初始化为 FIFO 模式
    //
    initI2CFIFO();

    //
    //初始化数据缓冲区
    //
    对于(i = 0;i < 2;I++)

    sData[i]= 0;
    RDATA[I]= 0;
    }


    //
    //启用此示例所需的中断
    //
    Interrup_enable (INT_I2CA_FIFO);
    //
    //启用全局中断(INTM)和实时中断(DBGM)
    //
    EINT;
    ERTM;

    initTMP1075();//设置 TMP1075

    //
    //永远循环。 暂停或放置断点以观察缓冲区。
    //
    While (1)(同时)

    //将为每个基于 Tx 和 Rx 的 Tx 生成 FIFO 中断
    //配置的中断级别。
    // ISR 将处理向/从 TX 和中推送/拉数据的问题
    // RX FIFO 或
    GPIO 写入引脚(device_GPIO _PIN_LED2,1);//关闭 LED2
    //device_delay_US (200);
    //
    //延迟。
    //
    温度=((浮点)结果)* 0.0625;

    //device_delay_US (500000);
    如果(!I2C_getStopConditionStatus (I2CA_BASE)))//检查停止条件是否为 true

    F+=1;
    开关(步骤)

    案例0:
    G = 5;
    //将温度传感器参数设置为读取温度
    I2C_setConfig (I2CA_BASE,I2C_MASTER_SEND_MODE);
    I2C_PUData (I2CA_BASE,POINT_TEMP);//将 TMP175指针设置为读取温度
    I2C_setConfig (I2CA_BASE,I2C_MASTER_receive_mode);
    //I2C_PUData (I2CA_BASE,0x00);//将 TMP175指针设置为读取温度
    //I2C_sendStartCondition (I2CA_base);//发送配置
    //I2C_PUData (I2CA_BASE,POINT_TEMP);//将 TMP175指针设置为读取温度
    //device_delay_US (1000);
    I2C_SendStartCondition (I2CA_BUS);//发送配置

    //I2C_sendStopCondition (I2CA_base);//发送配置
    步骤=1;//增量序列计数器
    //GPIO 写入引脚(device_GPIO _PIN_LED2,1);//关闭 LED2

    休息;
    案例1:
    //读取温度
    G=6;

    //I2C_setConfig (I2CA_BASE,I2C_MASTER_receive_mode);
    DEVICE_DELAY _US (1000);
    I2C_SendStartCondition (I2CA_base);//发送配置应读取到五分之三的中断进入
    //I2C_sendStopCondition (I2CA_base);//发送配置
    步骤=3;//增量序列计数器
    //GPIO 写入引脚(device_GPIO _PIN_LED2,0);//打开 LED2
    休息;


    案例3:
    //现在延迟
    G=7;
    DEVICE_DELAY _US (20000);
    步骤= 0;
    休息;

    }

    //I2C_setConfig (I2CA_BASE,I2C_MASTER_SEND_MODE);
    //I2C_PUData (I2CA_BASE,0x00);//将 TMP175指针设置为读取温度
    //I2C_sendStartCondition (I2CA_base);//发送配置
    //I2C_PUData (I2CA_BASE,0x00);//将 TMP175指针设置为读取温度
    //
    //延迟。
    //device_delay_US (200);
    // I2C_sendStopCondition (I2CA_base);//发送配置
    //GPIO 写入引脚(device_GPIO _PIN_LED2,0);//打开 LED
    //G = I2C_isBusy (I2CA_BASE);
    //H = I2C_isBusy (I2CA_BASE);
    // device_delay_US (200);

    //H = I2C_isBusy (I2CA_BASE);
    //G = I2C_isBusy (I2CA_BASE);


    //将 I2C 设置为主读取模式和读取温度

    //F = I2C_isBusy (I2CA_BASE);
    //I2C_setConfig (I2CA_BASE,I2C_MASTER_receive_mode);
    //I2C_sendStartCondition (I2CA_base);//发送配置
    //I2C_sendStopCondition (I2CA_base);//发送配置
    /*
    同时(I2C_isBusy (I2CA_BASE))

    I2C_SendStopCondition (I2CA_BUS);//发送配置
    j +=1;
    }
    J = 0;
    *
    //I2C_setConfig (I2CA_BASE,I2C_MASTER_receive_mode);
    //I2C_sendStartCondition (I2CA_base);//发送配置
    /*
    同时(I2C_isBusy (I2CA_BASE))

    I2C_SendStopCondition (I2CA_BUS);//发送配置
    j +=1;
    }
    J = 0;
    *
    //device_delay_US (200);
    //I2C_sendStopCondition (I2CA_base);//发送配置
    //device_delay_US (500);
    //I2C_sendStartCondition (I2CA_base);//发送配置

    //I2C_sendStopCondition (I2CA_base);//发送配置
    //device_delay_US (50000);
    //GPIO 写入引脚(device_GPIO _PIN_LED2,0);//打开 LED2
    GPIO 写入引脚(device_GPIO _PIN_LED1,0);//打开 LED1

    }

    }
    }//主页结束

    //
    //在 FIFO 模式下配置 I2C A 的功能。
    //
    ininitI2CFIFO()无效

    //
    //必须在配置 I2C 之前重置 I2C
    //
    I2C_disableModule (I2CA_BASE);

    //
    // I2C 配置。 使用工作周期为50%的400kHz I2CCLK。
    //
    I2C_INITMaster (I2CA_BASE,DEVICE_SYSCLK_FREQ,400000,I2C_DUTYCYCLE_50);
    I2C_setConfig (I2CA_BASE,I2C_MASTER_SEND_MODE);

    //I2C_setDataCount (I2CA_BASE,1);
    I2C_setDataCount (I2CA_BASE,2);
    I2C_setBitCount (I2CA_BASE,I2C_BICOUNT_8);

    //
    //配置温度传感器
    //
    I2C_setSlaveAddress (I2CA_BASE,从属地址);
    I2C_setEmulationMode (I2CA_BASE,I2C_Emulation_free 运行);

    //
    // FIFO 和中断配置
    //
    I2C_enableFIFO (I2CA_BASE);
    I2C_ClearInterruptStatus (I2CA_BASE,I2C_INT_TXFF);
    I2C_ClearInterruptStatus (I2CA_BASE,I2C_INT_RXFF);

    //
    //传输 FIFO 中断级别设置为生成中断
    //当16字节 TX fifo 包含2个或更小字节的数据时。
    //
    I2C_setFIFO InterruptLevel (I2CA_BASE,I2C_FIFO,TX2,I2C_FIFO,RX2);
    //I2C_enableInterrupt (I2CA_base,I2C_INT_TXFF | I2C_INT_STOP_Condition);
    //I2C_enableInterrupt (I2CA_base,I2C_INT_RXFF | I2C_INT_STOP_Condition);
    I2C_enableInterrupt (I2CA_BASE,I2C_INT_RXFF);
    //
    //配置完成。 启用模块。
    //
    I2C_enableModule (I2CA_BASE);

    //请等待以确保重置完成,然后再继续....
    DEVICE_DELAY _US (200);
    //
    }

    //
    // I2C TX 和设置 TMP1075
    //
    inittMP1075()无效


    //设置 TMP175配置寄存器
    I2C_setConfig (I2CA_BASE,I2C_MASTER_SEND_MODE);

    I2C_PUData (I2CA_BASE,POINT_CONFIG);//设置要配置的 TMP175指针
    I2C_PUData (I2CA_BASE,TMP175_CONFIG);//配置字节

    I2C_SendStartCondition (I2CA_BUS);//发送配置
    //
    //发送开始条件
    //
    //device_delay_US (1000);
    //device_delay_US (200);//我是否需要此功能?

    I2C_SendStopCondition (I2CA_BUS);//发送停止配置

    /*
    同时(I2C_isBusy (I2CA_BASE))

    j +=1;
    }
    *

    //device_delay_US (100);
    /*
    //设置 TMP175指针以读取温度
    //device_delay_US (500000);
    I2C_setConfig (I2CA_BASE,I2C_MASTER_SEND_MODE);
    I2C_PUData (I2CA_BASE,POINT_TEMP);//将 TMP175指针设置为读取温度
    I2C_SendStartCondition (I2CA_BUS);//发送配置
    I2C_SendStopCondition (I2CA_BUS);//发送配置
    *
    }


    //
    // I2C TX 和接收 FIFO ISR
    //
    _interrupt void i2cFIFO ISR(void)

    UINT16_t i;
    int a,b = 0;

    //
    //如果设置了接收 FIFO 中断标志,请读取数据
    //
    IF ((I2C_getInterruptStatus (I2CA_BASE)& I2C_INT_RXFF)!= 0)


    I2C_sendStopCondition(I2CA_base);//将停止发送到 I2C 总线
    对于(i = 0;i < 2;I++)

    RDATA[i]= I2C_getData (I2CA_BASE);
    }

    A =(int)(RDATA[0])<8);
    B =(int)(RDATA[1]| A);
    结果=b>>4;

    //result =((RDATA[0]<8)|(RDATA[1]>4));
    //temp =((浮点)结果)* 0.0625;
    //
    //清除中断标志
    //

    I2C_ClearInterruptStatus (I2CA_BASE,I2C_INT_RXFF);

    Example_PassCount++;

    GPIO 写入引脚(device_GPIO _PIN_LED1,1);//关闭 LED1
    Fiforx+=1;
    }

    //
    //发出 ACK
    //
    interrup_clearACKGroup (interrup_ACK_group8);
    }

    //
    //文件结束
    //

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

    史蒂夫  

    很遗憾,我们没有使用 tmp 1075的任何示例或参考代码。  

    是否可以将代码重新塑造为附件,以便更容易阅读?  

    此致

    西达尔斯

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

    你好 Siiharth,你想要哪个版本? 有三个粘贴版本。  如何添加附件而不是剪切和粘贴到论坛中并不完全清楚?

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

    您好,  

    您可以单击“插入”按钮,然后导航至“图像/视频/文件”选项,然后指定要上载的输入文件。

    您可以向我发送已添加停止条件的第二个版本。

    此致

    西达尔斯

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

    你好,Siddharth

    以下是 C 文件的链接:

    https://1drv.ms/u/s!AnKtyM9WfJhIrz5uKi4NOd36j-oS?e=TJckfc

    此版本与粘贴的版本略有不同,并且实际工作正常。 我认为其中一个问题是芯片启动,但它仍在使用设备延迟,因此不适合使用,当我尝试使用其他驱动程序库功能检查总线状态等时,它通常会导致程序失败。  

    监视变量如上所示,按顺序执行的操作与预期相当,每个中断(Fiforx)的循环应运行两次(F),但在 第一个中断进入之前循环运行两到三次,这有点意外。  

    总之,这一版本确实有效,但我可以就如何使其更好地发挥作用提出一些见解/想法吗?  

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

    史蒂夫  

    很高兴你能让它发挥作用。

    无法访问您附加的文件,因为 TI 已阻止对此文件共享站点的访问。 已请求访问。 一旦我进入,我就会看一遍。

    最好将文件附加到此线程,  

    此致

    西达尔斯

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

    e2e.ti.com/.../i2c_5F00_tmp1075.c

    您好,Siddharth,

    很抱歉,当我看到插入文件选项卡时,它看起来只能插入链接,而不能插入文件本身。 给你。

    S

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

    您好 Steve,

    谢谢,今天晚些时候我们将回顾一下,并返回给您。

    此致

    西达尔斯