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.
大家好、在 EMDC 为 i2040分项计量 EVM 生成的参考代码中、也提供了 I2C 接口。 使用我已启用的宏、它在构建时没有错误。 请注意、我们是否在此 EVM 上测试了 I2C? 如果是、请分享测试时使用的 I2C 主机示例。
Abhed、您好!
由 EMDC 生成的代码仅支持提供的 UART。 遗憾的是、我们没有开箱即用的支持 I2C 的代码。 但是、我们鼓励用户根据其特定应用修改此代码。 虽然通信类型和协议可能会发生变化、但您仍然可以利用 EMDC API、并且无需专注于如何开发/计算/测量计量参数。
请记住、如果您将通信类型从 UART 更改为 I2C、则无法使用具有该代码库的 EMDC GUI。 但是、假设目标器件支持相同的协议、则可以通过 I2C 将其与主机器件搭配使用。
此致、
James
尊敬的 James:
感谢您的回复。 感谢您澄清、I2C 接口尚未通过测试、并且在使用带有 i2040S EVM 的 EMDC 的开箱即用支持。 我打算仅在 I2C 接口上使用 EVM、并需要您的帮助。 请注意、您是否有任何已通过 i2040S EVM 验证的 I2C 主设备工作示例? 这将非常有帮助、因为这里的时间窗口有点短。
Abhed、您好!
我建议参考我们的 I2C 代码示例(寄存器级或 DriverLib)作为起点。 您可以在下面的链接中找到几个不同的示例、包括 I2C 主器件。
这里的应用是什么?
此致、
James
尊敬的 James:
该应用使用 i2040作为 I2C 上连接的计量前端。 假设只要在参考代码中定义了宏、I2C 通信就可以开箱即用。 但是、正如您所说的那样、情况并非如此。
要求您查看它的原因是为了节省精通代码的 gettign 的时间、然后找出错误(如果有)并修复代码。
我已经测试了与 F5529 LP 运行 I2C 主设备的 I2C 接口、但没有看到 i2040S 响应 I2C 回调函数。
您好!
我们已经在我们一侧进行了一些测试、似乎在几个步骤中启用了 I2C 通信。 请记住、我们尚未对其进行太多测试、它目前无法与 EMDC GUI 配合使用。 但是、您应该能够使用同一协议通过 I2C 主设备与目标 i20xx 器件进行通信。
以下是我们为实现这一目标而采取的步骤。 首先、使用适用于 MSP430i20xx 器件的 EMDC 生成您的项目。 对该代码库进行了以下更改。
//! \def 串行通信接口选择。 将其设置为有效 //! 接口或 COMM_NONE、用于禁用 COMM 模块。 //! #define COMM_SERIAL_INTERFACE (COMM_I2CSLAVE) //! \def 串行通信接口选择启用定义 //! 这些模块会自动设置为包括相关模块。 //! #if (COMM_SERIAL_INTERF=COMM_UART) #define UART__ENABLE (TRUE) #define I2CSLAVE__ENABLE (FALSE) #define TIMEOUT_ENABLE (FALSE) #Elif (COMM_SERIAL_INTERF=COMM_I2CSLAVE) #define UART_ENABLE (FALSE)#I2CSLAVE_ (TRUE )#define TIME_ENABLE (TRUE)#define TIMEOUT (TRUE)#define TIMEOUT (TRUE)
void Timer_startDelayedFunctionTimer (const tFunctionTimer * pFunctionTimer) { Timer_stopDelayedFunctionTimer (); g_pFunctionTimer = pFunctionTimer;FunREG16 (FUNCHTITITIME__Peripheral + OFS_TAxCCTL0)+~ ~(TUNCH_TIMC_TIMC_TIMC_TRUNTIMER) + TRUNTIME_TIMCTRUNTIME_TIMC_TRUNTIMER + TRUNTIMER (TIMC_TIONF_TRUNCH_TRUNTIMER + TRUNTIME_TRUNTIMER)+ TRUNCH_TRUNCH_TRUNTIMER + TRUNCH_TRUNCH_TRUNCH_TRUNTIMER + TRUNCH_TRUNTIMER (TIMCTRUNCH_TRUNCH_TRUNCH_TRUNCH_TRUNCH_TRUNCH_TRUNCH_TRUNCH_TRUNCH_TRUNCH_TRUNTIMER)+ TRUNTIMER + TRUNCH_TRUNTIMER (
//// 本地函数声明 ////************* // //! 初始化 GPIO //! //! 返回无 // //// 静态空 hal_system_gpioInit (void) { /* P1.6:I2C UCB.S.& P1.7:I2C UCB0SDA * GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、 GPIO_PIN6 | GPIO_PIN7、 GPIO_PRIMARY_MODULE_FUNCTION); }
// // //! \def I2CSLAVE__EUSCI_B_PERIPHERATE 定义 了//! eUSCI_B 实例正与该 I2C 从端口一起使用。 // //! \def I2CSLAVE__ADDRESS 定义了与此 //! 器件。 //// ***************** #define I2CSLAVE__EUSCI_B_PERIPHERATE(EUSCI_B0_BASE) #define I2CSLAVE__ADDRESS(0x0A)
现在、假设您的主机 I2C 器件使用正确的从器件地址和相同的协议、则通信应该起作用。 在我们的测试中、我们使用了 EVM430-i2040S 并连接到 J9接头上裸露的 I2C 引脚 P1.6和 P1.7。 查看 EVM430-i2040S 原理图、对 P1.7 (UCB0SDA)使用 J9.1、对 GND 使用 J9.2、对 P1.6 (UCB.S)使用 J9.3。
我们通过此 EMDC 命令数据包(十六进制格式)发送、通知目标 i20xx 开始定期发送数据。 如果您对该协议有疑问、可以参考 EMDC 技术指南中的协议部分。 设备发送回了指示通信正常的内容。
55AA060401010700
此致、
James
尊敬的 Abhed:
除了 James 提到的 I2C 从设备更改之外、下面是使用 F5529 LP 的 I2C 主设备的示例:
e2e.ti.com/.../MSP430F55xx_5F00_usci_5F00_i2c_5F00_master_5F00_EMDC.c
我们将 Launchpad 中的 P3.0和 P3.1用于之前 James 在 i2040 EVM 上提到的 I2C 引脚。
示例发送了一条命令以将 i2040设置为活动模式:
然后它定期轮询从器件:
希望对您有所帮助。
此致、
Luis Reynoso
尊敬的 James:Abhed、
我尝试了与上述步骤类似的操作、将 Arduino 保留为主控方、将 MSP430i 保留为从方以执行 i2c 读取、我将这两个命令帧从 Arduino 发送到从方地址0x0A 上的 MSP:
字节 COMMAND_FRAME[]={0x68、0x99、0x99、0x99、0x99、 0x99、0x99、0x68、0x23、0x03、 0x52、0x00、0x00、0xDE、0x16};
字节 COMMAND_FRAME[]={0x55、0xAA、0x06、0x04、0x01、 0x01、0x01、0x07、0x00};
但是、在此过程中、我没有收到 MSP 的任何响应、请分享您通过 i2c 发送的命令数据包、您已成功从从从器件获取读取响应、如果需要、我也可以在此处共享 Arduino 主机代码
谢谢、
Riju
您好 Riju、
第二个数据包{0x55、0xAA、0x06、0x04、0x01、 0x01、0x01、0x07、0x00}看起来正常。
如果 i2040未进行堆叠、则可能是硬件问题(即上拉)或软件(即 i2040未正确配置/重新编程)。
但 i2040似乎正在对地址进行堆栈、这应表明已正确对其进行编程。
如果 i2040正在堆栈'Write'命令、那么我假设它也在堆栈'Read'命令。 发送'read'命令后您会得到什么? 您有任何屏幕截图吗?
您使用的是哪种 I2C 速度?
此致、
Luis R
您好、Luis、
下面是我要做的:
1) 1)根据 James 的回复更改了 TI 代码的宏在 EVM (MSP430i2040)上下载了相同的文件、使其作为 I2C 从设备运行
2)制作了 Arduino 代码、使其作为主机运行、并发送命令 {0x68、0x99、0x99、0x99、0x99、0x99、 0x99、0x99、0x68、0x23、0x03、 0x52、0x00、0x00、0xDE、0x16}、 根据 TI 文档(slaa638)中提供的串行通信命令创建:
#include int i2c_slave_address = 0x0A;// TI 的 I2C 从器件地址 //int i2c_slave_address = 0x48;// TI 的 I2C 从器件地址 //int CMPH、CMTL;//命令高数据和低数据字段 字节 COMMAND_FRAME[]={0x68、0x99、0x99、0x99、0x99、0x99、0x99、 0x99、0x99、0x68、0x23、0x03、 0x52、0x00、0x00、0xDE、0x16}; //byte COMMAND_FRAME[]={0x55、0xAA、0x06、0x04、0x01、 0x01、0x01、0x07、0x00}; //55AA0604010101010700 void setup (){ Wire.begin();//启动线库 Serial.begin(9600); int l = sizeof (command_frame); delay (1000); Wire.beginTransmission(i2c_slave_address); for (int i=0;i3) 3)连接 Arduino 和 EVM 的 SDA 和 SCL 引脚后执行上述代码
4)但我仅接收 FF 作为输出
我需要实现的目标:
1)来自 EVM 的正确响应帧(计量数据)、适用于 TI 文档(slaa638)链接:http://www.ti.com/general/docs/litabsmultiplefilelist.tsp?literatureNumber=slaa638中给出的各种命令
如果有人能够列举实现相同目标的分步方法、将会有巨大的帮助
谢谢、
Riju
您好、Abhed、Luis、James、
我尝试发送另一个命令帧 {0x04、0x02、0x00、0x05、0x01、 0x0C、0x00}通过 I2C 从 Arduino (主机)到 MSP (从机)、这是我根据 EMDC 技术指南中提供的通信协议制作的、我希望在其中获取应用程序版本以进行响应、但我仍然无法获得预期的响应
谢谢、
Riju
您好 Riju、
您使用的是 SLAA638还是 EMDC 中的代码? 上述步骤适用于将 I2C 与 EMDC 搭配使用、后者的协议与 SLAA638不同。
您可以在 EMDC 文档中找到有关 EMDC 协议的详细信息。
例如,在封装中{}0x55,0xAA,0x06,0x04,0x01,0x01,0x01,0x07,0x00
:
0x55、0xAA:EMDC 协议的标头(packet_sync + packet_blank)
0x06:数据包长度
0x04:设计中心 ID
0x01:命令=配置模式
0x01:R/W =写入
0x01:应用模式=激活
0x07、0x00:校验和(0x04 + 0x01 + 0x01 + 0x01的总和)
此致、
Luis R
您好、Luis、
感谢您的有效回答、我正在使用 EMDC 代码。TI 的某个人先前曾向我指出、我可以查看 slaa638的协议、无论如何1)我尝试使用上述数据包(55AA06040101010700)、但仍未获得任何输出、 和2)我在上述链接中提供的 EMDC 通信协议文档中找不到有关接头(55AA)的信息
谢谢、
Riju
您好、Luis、
我在主机(Arduino)端修改了代码、并重新检查了连接并刷新了 EMDC 代码、MSP 似乎正在堆叠至我的命令 {0x55、0xAA、0x07、0x04、0x01、 0x00、0x01、0x06、0x00}、其中包含以下内容:6 4 1 0 6 0、我希望解码如下:
6 -数据包长度
4 -设计中心 ID
1-命令(配置模式)
1 -写入
0 -应用模式(空闲)
6 -校验和 LSB
0 -校验和 MSB
但现在、当我将命令帧更改为 {0x55、0xAA、0x07、0x04、0x02、 0x00、0x05、0x00、0x0B、0x00}根据 EMDC 文档、期望应用版本作为输出 MSP 以相同的6 4 1 0 6 0对我做出响应、您能帮助我了解我如何接收各种参数、例如电压(Vrms 等)、作为输出/响应的电流
谢谢、
Riju
您好 Riju、
我在我的一侧尝试过它、我可以看到器件不能正确处理该数据包以及后续数据包。
EMDC 使用基于 CapTIvate 设计中心的协议、需要接头通过 HID 桥进行通信。 您可以在 CapTIvate 技术指南中找到更多信息 查看"使用 HID 桥"部分、此处的屏幕截图可为您提供便利:
*默认情况下、器件处于空闲模式。 其他2种模式为校准和激活
*当器件处于活动模式时、它将在结果准备就绪后开始定期发送结果。
*在我之前的帖子中、我展示了如何将器件置于活动模式。
*此功能的代码位于:
MAIN->EMLibGUIApp_Engine->HMI_stateMachine -> HMI_processPhaseResults (仅在活动模式下调用)->HMI_sendPhaseResults (如果结果就绪则调用)
*需要注意的一点是、在使用 UART 和 I2C 之间输出信息的功能略有不同。
-在 UART 模式下、器件不必等待主机、只需按顺序输出所有信息。
-在 I2C 中、通信仅由主机发起、因此 MSP430将把数据放入缓冲区并使用 GPIO 发起请求。 您可以在 I2CSlave_setRequestFlag 中找到实现。 用于发起请求的引脚由 I2CSLAVE__REQ_Pdir、I2CSLAVE__REQ_pout、I2CSLAVE__REQ_MASK 定义。
请注意、创建当前方法的目的是简化校准过程、并持续向 EMDC GUI 发送数据。 当前没有特定命令可按需请求特定值;但是、您可以根据需要修改现有命令或添加新命令。
此致、
Luis R
您好 Riju、
Luis 不在办公室、因此我想检查一下他的最新答复是否有助于解决您的问题。 谢谢!
此致、
James
您好、James、Luis、
感谢您对该问题的宝贵见解,我们已经确定了 Luis 在数据包中指出的认证,然后发送了正确的数据包,现在我们将根据 EMDC 文档按顺序发送各种命令 :
1) 1)在重新启动器件后立即发送读取应用程序版本命令一次、响应为0FFFFFFFF、在第二次接收到所需的响应 542170时发送该命令、
您好、Luis、
另一个澄清是、当您说"请注意、创建当前方法是为了简化校准程序、并持续向 EMDC GUI 发送数据。 当前没有特定命令可按需请求特定值;但是、您可以根据需要修改现有命令或添加新命令。" 这是否意味着对于当前使用的代码、我将不会获得以下结果参数:
1) Vrms
2) IRMS
3) Vpeak
4) IPEAK
5)功率因数
6) 6)频率
7) 7)有功功率
8)无功功率
9)视在功率
10)有功电能
11)无功电能
12)视在能量
通过 I2C 通信、即使在遵循 EMDC 文档中遵循的步骤(初始命令交换时序图)之后也是如此
谢谢、
Riju
您好 Riju、
请记住、随 EMDC 一起发布的应用代码旨在支持 UART 通信、因此、尽管我们在进行了一些更改后 I2C 通信现在仍在工作、但似乎应用代码中的其他内容应该进行更改、以使此命令能够发回所有结果 (因为它通过 UART 正常工作)、而不仅仅是最后一组结果、即视在电能。 路易斯和我还有其他紧迫的优先事项、但将研究发生这种情况的原因、并在星期五之前回复您。 谢谢。
此致、
James
尊敬的 James:
感谢您的响应、我们将热切地等待您的最终更新
谢谢、
Riju
您好 Riju、
当使用 UART 将器件置于活动模式时,它将调用 HMI_processPhaseResults(),并将按顺序(即 VRMS->IRMS->Vpeak 等)通过 UART 自动发送结果。
使用 I2C 时、MSP430仍在调用该函数、并且仍会尝试从 VRMS 开始发送该函数。 但是、在 I2C 中、器件不能只在需要时传输数据(因为主器件始终启动通信)、因此 MSP430会将数据放置在缓冲器中、然后设置请求标志/引脚。 如果您的主机未检查此引脚、则它将永远不会请求数据、MSP430将超时、然后它将尝试发送下一个数据包(即 IRMS、Vpeak 等)。
一个选项是更改主机以检查此请求引脚、并且每次只从 MSP430读取数据。 此选项不需要对 MSP430进行任何更改、但您必须在 I2C 主设备上实现该功能。
另一个选项是创建/修改命令、此选项的一个优点是可以根据需要请求数据。 我认为这种选择可以满足您的需求、因此我将解释如何执行
此示例展示了如何添加命令以发送 VRMS。 请注意、我使用命令0x02 (应用程序版本)作为起点:
1.在 emDCCommandHandlers.c 中创建函数原型
3.在 emDCCommandHandlers.h 中定义新的命令 ID (请注意,我的“新命令”与 COMMAND_RMS_ID 相同,后者是从器件发送的响应,但我将其添加为新的定义,以备您自定义之用)
4.在 emDCCommandHandlers.c 中写入新函数(请注意、当主控方尝试"写入"时、我的函数会忽略、当主控方尝试"读取"时、它会发送 VRMS 的最新值)
5.增加 comm_config.h 中的命令侦听器数量
6.测试新命令(0x80)
请注意、我的"VRMS"可能没有意义、因为我只是尝试发送增量虚拟数据来测试我的实现;但是、它包括:
0x0A (LEN 10字节)、0x04 (ID)、0x80 (VRMS ID)、0x01 (写入)、0x01 (A 相)、 0x001EB59A (VRMS 有效载荷)、0x01F3 (校验和)
可以按照相同的步骤发送所有其他参数。
我希望这对您有所帮助、如果您有其他问题、请告知我们。
此致、
Luis R
您好 Riju、
我希望事情进展顺利、Luis 的详细说明有助于解决您的问题。 您是否能够使通信正常工作? 谢谢。
此致、
James
您好、Luis、
非常感谢您、在执行您之前的响应中提到的给定更改后、我能够重现相同的结果、只有一个简单的澄清、我才能够正确地解释我们从主器件发送的数据包上的字节:
55 AA -插头
07 -长度
04 - 设计中心 ID
80 - Vrms 命令
00 -读取
00 -无关(请澄清)
00 -无关 (请澄清)
84 00 -校验和
谢谢、
Riju
您好 Riju、
路易斯今天已经结束了一天的工作、所以我会在他外出时尽力提供帮助。 这两个字节被视为"无关"、因为它们是空的有效负载字节、因为长度已定义为7 (字节)。 命令处理程序正在寻找 VRMS 命令、因此它们实际上无关紧要。 我怀疑您可以将长度从7更改为5并删除这两个字节、因为校验和也不会改变、所以行为是相同的。
我希望这是有道理的。
此致、
James