工具/软件:
您好!
我当前正在尝试使用 MSP432 与 I2C 器件进行通信、我想知道如何建议实现此例程、以按以下格式发送自定义 I2C“事务“:
- 信号开始
- 向总线写入 1-N 个任意字节
- 从总线读取 0-N 个任意字节
- 信号停止
为了实现此行为、我必须向 FSM 发送哪种命令?
我遇到了以下问题:
- 如果外设未确认初始字节、则 I2C 外设似乎被捕获。
- 我不确定如何在不读取的情况下只向总线写入一个字节。
即 GCC 编译器、无 RTOS 和 DriverLib。
谢谢!
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.
工具/软件:
您好!
我当前正在尝试使用 MSP432 与 I2C 器件进行通信、我想知道如何建议实现此例程、以按以下格式发送自定义 I2C“事务“:
为了实现此行为、我必须向 FSM 发送哪种命令?
我遇到了以下问题:
即 GCC 编译器、无 RTOS 和 DriverLib。
谢谢!
您好、
本应用报告演示了如何使用 MSP432E4 微控制器上具有 I2C 主 器件、与系统中的从器件进行通信。
https://www.ti.com/lit/pdf/slaa776
MSP432E 适用于 I2C 模块的 SDK 中也有许多示例。 我将建议您先从 i2c_mastermode_simple_transfer 开始、然后是 ic2_mastermode_repeateststart_transfer。

如果外设未确认初始字节、则似乎会捕获 I2C 外设。
如果从器件没有 ACK、则从器件很可能未正确寻址。 我假设您在 SCL 和 SDA 总线上都有适当的上拉电阻器、对吧? 你有什么奴隶? 如果您可以在 I2C 总线上显示逻辑分析仪捕获结果、我可以帮您查看一下。
尊敬的 Charles:
我在 SCL 和 SDA 上有适当的上拉电阻。 我不能分享与哪个器件通信、但我可以说、它有一个初始化序列、需要将一个字节写入 I2C 总线和 NACK
我知道这是一种非标准行为、但我想知道 I2C FSM 的工作原理、以及如何让它仅发送一个字节。
编辑:此外、突发模式是否可用于实现与单字节命令等效的行为?
谢谢!
[quote userid=“607192" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1543134/msp432e401y-i2c---how-to-send-arbitrary-i2c-payloads/5939780、要求将单个字节写入 I2C 总线和 NACK。
您好 Shranav、
我在这里只能很清楚。 您是否希望收到从动器件的 NACK、这是真正的预期行为? 如果是这种情况、FSM 将收到错误。 如果主器件接收到 NACK、则它将停止并中止传输。
18.3.1.4 确认
所有总线事务都有一个所需的确认时钟周期、该时钟周期由主器件生成。 期间
在确认周期中、发送器(可以是主器件或从器件)会释放 SDA 线。
为了确认事务、接收器必须在确认时钟期间下拉 SDA
占空比。 在确认周期内、接收器发出的数据必须符合
第 1280 页的“数据有效性“中描述了数据有效性要求。
当从接收器没有确认从器件地址时、SDA 必须由从器件保持为高电平
以便主器件可以生成停止条件并中止当前传输。 这一点很重要
器件在传输期间充当接收器、负责确认每次传输
所做的。 由于主器件控制传输中的字节数、因此它会向发出信号
通过不在最后一个数据字节上生成确认来向从发送器结束数据。 。
然后、从发送器必须释放 SDA 以允许主器件生成停止或重复结果
启动条件。
如果从器件需要提供手动 ACK 或 NACK、则为 I2C 从器件 ACK 控制
(I2CSACKCTL) 寄存器允许从器件否定确认无效数据或命令、或确认有效
数据或命令。 启用此操作后、MCU 从模块 I2C 时钟被拉至低电平
在最后一个数据位之后、直到该寄存器写入指示的响应。
如果在突发期间数据为 NACK 且设置停止位
在 I2CMCS 寄存器中、传输终止。 如果停止位未置位、则为软件应用程序
当 NACK 中断有效时、必须发出重复的停止或启动条件。 如果是 NACK、
I2CMBCNT 寄存器可用于确定之前传输的数据量
突发终止。 如果在传输过程中该地址为 NACK、则发出停止条件。
您是否希望从设备收到 NACK、这是真正的预期行为?
是的、这就是对器件的预期。 对不起,如果这使事情复杂化。
因此、根据您发送给我的信息、我将执行以下操作:
I2CMasterSlaveAddrSet (...、deviceAddr、false);
while (I2CMasterBusy (...)) {}
I2CMasterDataPut (...、0x00);// 0x00 永远不会发送、因为我们期望 NACK
I2CMasterControl (I2C_MASTER_CMD_SINGLE_SEND);// addr 已发送且无应答
使 I2CMasterErr (...) 生效 == I2C_MASTER_ERR_ADDR_ACK;
为了之后发送数据、我可以根据 DriverLib SDK 中的示例代码重试。