您好!
主 控:MCP2221微芯片 USB 至 i2c 桥接器。 驱动程序是标准 MCP Linux 驱动程序。 100kHz i2c 总线速度。
从器件: MSP430F5308 @ 8MHz、使用 USCI 外设并略微修改了 TI 示例代码。
测试设备: 内置 i2c 总线分析仪的 LeCroy 示波器。 ArdvaarK/Beagle TotalPhase I2C 数据包分析器。 i2c 上拉电阻大约为2K、100kHz 时的边缘看起来很好很清晰、i2c 波形恰好超过0v、一直到3.3V。
问题: 当 MCP2221请求从机发送单个8字节数据包时、MCP2221不会生成 ACK 时钟、这会导致状态机在两侧中断。 速度100kHz I2C。 8MHz F5308时钟。
分析: 经过全面的故障排除后、当 MSP430以8MHz 运行时、它需要8us 附近的一些器件来响应传入的7位地址+R/W、 然后、为了释放时钟(即我们认为430正在拉伸时钟)、当它释放时钟以供 MCP 启动 ACK 脉冲时、MCP2221不会正确响应、而不是发送 ACK、只是开始为数据字计时。 我们假设430需要8us 来处理"我的地址是否"并解释 R/W 位。
这只发生在从机发送上、而不是从机写入上。 当 MSP430的时钟速度增加到16或24MHz 时、MCP 会正确生成 ACK、一切工作正常。 在另一个也使用 USCI 的编程器代码中观察到一个情况、但在另一个 MSP430系列中、ACK 脉冲为正常的1/4 100 kHz 脉冲宽度、这表明我们加快了 MSP430时钟解决问题。 通过提高430代码速度并进一步证实时钟拉伸理论、这个代码也被固定(即、时钟脉冲返回到正常宽度)。
我们在 MSP430上以更高的时钟速率运行了一些测试、如果时钟速度增加到8MHz 以上、例如16或24MHz、那么在大约与时钟速度增加成比例的时间延迟内释放时钟所需的时间似乎更少。 这可以实现更高的 i2c 速度、但对于 MCP2221不正确接受时钟拉伸、则是一种权变措施。
当然、我们正在与 Microchip 合作、以查看我们是否可以重新编程 MCP2221的驱动器、以便更好地利用时钟拉伸、但在平均时间内:
问题:
1) 1)有什么想法、为什么我们看到的是从器件发送而不是从器件接收?
2) 2)是地址和 ACK 之间的往返延迟、具体取决于 MSP430上的纯时钟周期或我们正在处理的 RC/模拟/传播类型延迟。
3) 3)是否有一些我们缺少的设置或代码会使 MSP430不会在 R/W 位和 ACK 之间插入时钟拉伸延迟(即、我们能否加快430在 I2C 从器件发送 ACK 上释放总线所需的时间)?
谢谢! Blake