Other Parts Discussed in Thread: TMS570LS1227
您好!
我有一个 TMS570LS1227 HDK、我将其与 I2C 从芯片配合使用。 主 I2C 配置如下所示。
/**-设置 i2c 模式*/
i2cREG1->MDR =(uint32)((uint32) 0U << 15U)// nack 模式
|(uint32)((uint32) 0U << 14U)/*自由运行*/
|(UINT32)(0U)/*开始条件-仅主机*/
|(uint32)((uint32) 1U <<11U)/*停止条件*/
|(UINT32)((UINT32) 1U <<10U)/*主/从模式*/
|(uint32)((uint32) I2C_transmitter)/*发送器/接收器*/
|(UINT32)((UINT32) I2C_7BIT_AMODE)/* xpaned 地址*
|(uint32)((uint32) 1U << 7U)/*重复模式*/
|(uint32)((uint32) 0U << 6U)/*数字回路*/
|(uint32)((uint32) 0U << 4U)/*起始字节-仅主机*/
|(uint32)((uint32) 0U << 3U)/*免费数据格式*/
|(UINT32)(I2C_8_BIT);/*位计数*/
/**-设置 i2c 向后兼容模式*/
i2cREG1->eMDR = 0U;
/**-禁用 DMA */
i2cREG1->DMACR = 0x00U;
/**-设置 i2c 数据计数*/
i2cREG1->CNT = 8U;
/**-禁用所有中断*/
i2cREG1->IMR = 0x00U;
/**-设置预分频*/
i2cREG1->PSC = 10U;
/**-设置时钟速率*/
i2cREG1->CKH = 36U;
i2cREG1->CKL = 36U;
/**-设置 i2c 引脚功能模式*/
i2cREG1->PFNC =(1U);
/**-设置 i2c 引脚默认输出值*/
i2cREG1->DOUT =(uint32)((uint32) 1U << 1U)/* sda 引脚*/
|(uint32)(1U);/* SCL 引脚*/
/**-设置 i2c 引脚输出方向*/
i2cREG1->DIR =(uint32)((uint32) 1U << 1U)/* sda 引脚*/
|(uint32)(1U);/* SCL 引脚*/
/**-设置 i2c 引脚开漏使能*/
i2cREG1->PDR =(uint32)((uint32) 1U <<1U)/* sda 引脚*/
|(uint32)(1U);/* SCL 引脚*/
/**-设置 i2c 引脚上拉/下拉使能*/
i2cREG1->PD =(uint32)((uint32) 0U << 1U)/* sda 引脚*/
|(uint32)(0U);/* SCL 引脚*/
/**-设置 i2c 引脚上拉/下拉选择*/
i2cREG1->PSEL =(uint32)((uint32) 1U <<1U)/* sda 引脚*/
|(uint32)(1U);/* SCL 引脚*/
它运行得非常好。 但是、在某些情况下、从器件需要更多的时间来处理请求。 从器件 I2C 数据表对此进行了说明
"i2c 芯片在运行每条指令时需要执行时间。 一个外部主器件可以在这个时间过后获得一个成功的结果。 如果外部主器件在未完成的执行过程中发送一条读取指令、它将收到1字节的错误(0xFF)。"
正确的工作顺序如下所示。 在这个表中、正如我在第三列中提到的、从器件对读取响应 NAK、随后是0xFF + ACK、重新读取-> NAK、0xFF +ACK ...直到它对读取响应 ACK。
| 时间[s] | 分析器名称 | 解码的协议结果 | |
| 0.24614475 | I2C | 设置读取到[0xC9]+ ACK | |
| 0.246235625 | I2C | 0x04 + ACK | |
| 0.246334 | I2C | 0x11 + ACK | |
| 0.24643725 | I2C | 0x33 + ACK | |
| 0.246543 | I2C | 0x43 + NAK | |
| 0.250027375 | I2C | 设置写入[0xC8]+ ACK | 请求从机的第1个写入 |
| 0.25011825 | I2C | 0x03 + ACK | |
| 0.2502115 | I2C | 0x27 + ACK | |
| 0.25030475 | I2C | 0x81 + ACK | |
| 0.250400625 | I2C | 0x04 + ACK | |
| 0.250498875 | I2C | 0x00 + ACK | |
| 0.25059975 | I2C | 0x00 + ACK | |
| 0.250698 | I2C | 0x8E + ACK | |
| 0.250796375 | I2C | 0x54 + ACK | |
| 0.250892125 | I2C | 0x00 + ACK | |
| 0.250990375 | I2C | 0x00 + ACK | |
| 0.25108875 | I2C | 0x00 + ACK | |
| 0.2511845 | I2C | 0x00 + ACK | |
| 0.251282875 | I2C | 0x00 + ACK | |
| 0.25138125 | I2C | 0x00 + ACK | |
| 0.251477 | I2C | 0x0E + ACK | |
| 0.25157775 | I2C | 0x54 + ACK | |
| 0.251676125 | I2C | 0x00 + ACK | |
| 0.251774375 | I2C | 0x00 + ACK | |
| 0.25187025 | I2C | 0x00 + ACK | |
| 0.2519685 | I2C | 0x00 + ACK | |
| 0.25206675 | I2C | 0x00 + ACK | |
| 0.252162625 | I2C | 0x00 + ACK | |
| 0.252260875 | I2C | 0x0E + ACK | |
| 0.252359125 | I2C | 0x54 + ACK | |
| 0.252455 | I2C | 0x00 + ACK | |
| 0.25255325 | I2C | 0x00 + ACK | |
| 0.252654 | I2C | 0x00 + ACK | |
| 0.252752375 | I2C | 0x00 + ACK | |
| 0.25284825 | I2C | 0x00 + ACK | |
| 0.2529465 | I2C | 0x00 + ACK | |
| 0.25304475 | I2C | 0x0E + ACK | |
| 0.253140625 | I2C | 0x54 + ACK | |
| 0.253238875 | I2C | 0x00 + ACK | |
| 0.25333725 | I2C | 0x00 + ACK | |
| 0.253433 | I2C | 0x00 + ACK | |
| 0.253531375 | I2C | 0x00 + ACK | |
| 0.253632125 | I2C | 0x00 + ACK | |
| 0.2537305 | I2C | 0x00 + ACK | |
| 0.25382875 | I2C | 0x46 + ACK | |
| 0.253924625 | I2C | 0x64 + ACK | |
| 0.2540505 | I2C | 设置读取到[0xC9]+ NAK | 结果的第一个读取到从器件 |
| 0.25414125 | I2C | 0xFF + ACK | |
| 0.25725775 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.2573485 | I2C | 0xFF + ACK | |
| 0.26026525 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.260356 | I2C | 0xFF + ACK | |
| 0.2632345 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.26332525 | I2C | 0xFF + ACK | |
| 0.2662625 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.2663535 | I2C | 0xFF + ACK | |
| 0.269270125 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.269361 | I2C | 0xFF + ACK | |
| 0.272236375 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.272327125 | I2C | 0xFF + ACK | |
| 0.275285125 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.275376 | I2C | 0xFF + ACK | |
| 0.278275125 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.278365875 | I2C | 0xFF + ACK | |
| 0.281220625 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.281311375 | I2C | 0xFF + ACK | |
| 0.28424875 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.2843395 | I2C | 0xFF + ACK | |
| 0.28725625 | I2C | 设置读取到[0xC9]+ ACK | 从器件响应成功 |
| 0.287347125 | I2C | 0x04 + ACK | |
| 0.2878655 | I2C | 0x00 + ACK | |
| 0.287966375 | I2C | 0x03 + ACK | |
| 0.28807225 | I2C | 0x40 + NAK | |
| 0.289808625 | I2C | 设置写入[0xC8]+ ACK | 第二次写入以请求从器件 |
| 0.289899375 | I2C | 0x03 + ACK | |
| 0.289992625 | I2C | 0x27 + ACK | |
| 0.290091 | I2C | 0x81 + ACK | |
| 0.29018675 | I2C | 0x00 + ACK | |
| 0.290285 | I2C | 0x00 + ACK | |
| 0.29038325 | I2C | 0x01 + ACK | |
| 0.290479125 | I2C | 0x04 + ACK | |
| 0.290577375 | I2C | 0x05 + ACK | |
| 0.290675625 | I2C | 0x05 + ACK | |
| 0.290771375 | I2C | 0x05 + ACK | |
| 0.29087225 | I2C | 0x11 + ACK | |
| 0.290705 | I2C | 0x22 + ACK | |
| 0.291068875 | I2C | 0x33 + ACK | |
| 0.291164625 | I2C | 0x44 + ACK | |
| 0.291262875 | I2C | 0x00 + ACK | |
| 0.29136125 | I2C | 0x00 + ACK | |
| 0.291457 | I2C | 0x00 + ACK | |
| 0.29155525 | I2C | 0x00 + ACK | |
| 0.291653625 | I2C | 0x00 + ACK | |
| 0.2917495 | I2C | 0x00 + ACK | |
| 0.29185275 | I2C | 0x00 + ACK | |
| 0.2919485 | I2C | 0x00 + ACK | |
| 0.292046875 | I2C | 0x00 + ACK | |
| 0.29214275 | I2C | 0x00 + ACK | |
| 0.292241 | I2C | 0x00 + ACK | |
| 0.29233925. | I2C | 0x00 + ACK | |
| 0.292435125 | I2C | 0x00 + ACK | |
| 0.292533375 | I2C | 0x00 + ACK | |
| 0.29263175 | I2C | 0x00 + ACK | |
| 0.2927275 | I2C | 0x00 + ACK | |
| 0.29283075 | I2C | 0x00 + ACK | |
| 0.2929125 | I2C | 0x00 + ACK | |
| 0.2930275 | I2C | 0x00 + ACK | |
| 0.29312575 | I2C | 0x00 + ACK | |
| 0.2932215 | I2C | 0x00 + ACK | |
| 0.293319875 | I2C | 0x00 + ACK | |
| 0.29341825 | I2C | 0x00 + ACK | |
| 0.293514 | I2C | 0x00 + ACK | |
| 0.29361225 | I2C | 0x02 + ACK | |
| 0.2937105 | I2C | 0x3B + ACK | |
| 0.2938365 | I2C | 设置读取到[0xC9]+ NAK | 第二次读取从器件结果 |
| 0.29392725 | I2C | 0xFF + ACK | |
| 0.297190875 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.29728175 | I2C | 0xFF + ACK | |
| 0.300219125 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.300309875 | I2C | 0xFF + ACK | |
| 0.303226625 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.303317375 | I2C | 0xFF + ACK | |
| 0.306213375 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.30630425 | I2C | 0xFF + ACK | |
| 0.309162 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.30925275 | I2C | 0xFF + ACK | |
| 0.3121695 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.31226025 | I2C | 0xFF + ACK | |
| 0.315363 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.315453875 | I2C | 0xFF + ACK | |
| 0.31913925 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.31923年 | I2C | 0xFF + ACK | |
| 0.32214675 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.3222375 | I2C | 0xFF + ACK | |
| 0.32509525 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.325186 | I2C | 0xFF + ACK | |
| 0.32816475 | I2C | 设置读取到[0xC9]+ ACK | 成功的从器件结果 |
| 0.328255625 | I2C | 0x04 + ACK | |
| 0.328811625 | I2C | 0x00 + ACK | |
| 0.328912375 | I2C | 0x03 + ACK | |
| 0.32902075 | I2C | 0x40 + NAK | |
| 0.3336655 | I2C | 设置写入[0xC8]+ ACK | |
| 0.33375625 | I2C | 0x03 + ACK | |
| 0.333849625 | I2C | 0x0B + ACK | |
| 0.333942875 | I2C | 0x82 + ACK | |
| 0.334043625 | I2C | 0x00 + ACK | |
| 0.3341395 | I2C | 0x00 + ACK | |
| 0.33423775 | I2C | 0x00 + ACK | |
| 0.334336 | I2C | 0x11 + ACK | |
| 0.334431875 | I2C | 0x22 + ACK | |
| 0.334530125 | I2C | 0x33 + ACK | |
| 0.334628375 | I2C | 0x44 + ACK | |
| 0.33472425 | I2C | 0x3E + ACK | |
| 0.3348225 | I2C | 0xD2 + ACK | |
| 0.334948375 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.335039125 | I2C | 0xFF + ACK | |
| 0.338117375 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.33820825 | I2C | 0xFF + ACK | |
| 0.341062875 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.34115375 | I2C | 0xFF + ACK | |
| 0.344049 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.344139875 | I2C | 0xFF + ACK | |
| 0.3470565 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.347147375 | I2C | 0xFF + ACK | |
| 0.350398625 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.350489375 | I2C | 0xFF + ACK | |
| 0.353406125 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.353496875 | I2C | 0xFF + ACK | |
| 0.35649625 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.356587125 | I2C | 0xFF + ACK | |
| 0.359589625 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.359680375 | I2C | 0xFF + ACK | |
| 0.362535125 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.362625875 | I2C | 0xFF + ACK | |
| 0.36610075 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.3661915 | I2C | 0xFF + ACK | |
| 0.36919475 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.3692855 | I2C | 0xFF + ACK | |
| 0.372450375 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.372541125 | I2C | 0xFF + ACK | |
| 0.37531625 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.375407 | I2C | 0xFF + ACK | |
| 0.378344375 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.378435125 | I2C | 0xFF + ACK | |
| 0.3812485 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.38133925 | I2C | 0xFF + ACK | |
| 0.384442125 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.384532875 | I2C | 0xFF + ACK | |
| 0.387490875 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.38758175 | I2C | 0xFF + ACK | |
| 0.390460125 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.390551 | I2C | 0xFF + ACK | |
| 0.393736375 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.393827125 | I2C | 0xFF + ACK | |
| 0.39659925 | I2C | 设置读取到[0xC9]+ NAK | |
| 0.39669 | I2C | 0xFF + ACK | |
| 0.39966875 | I2C | 设置读取到[0xC9]+ ACK | 成功 的结果 |
| 0.399759625 | I2C | 0x04 + ACK | |
| 0.4003205 | I2C | 0x00 + ACK | |
| 0.400421375 | I2C | 0x03 + ACK | |
| 0.400524625 | I2C | 0x40 + NAK |
如果我尝试在 TMS570LS12x 中执行这个操作、主器件在从器件响应 NAK 进行读取时立即下拉 SCL 线路。 在 eMDR 中设置忽略 NACK 不会有帮助、因为它只是继续读取数据并将其复制为0xFF 4倍、因为计数设置为4。
在上图中、当从器件响应 NAK 进行读取操作和0xFF+ACK 时、SCL 保持~3millisec 并重新读取从器件、然后继续...
一旦 TMS570LS12x 主器件与从器件的 NAK 响应一起卡住、我们如何恢复它并实现上述功能?
可以帮助我在 TMS570LS12x 控制器中实现这一点吗?
谢谢、
此致、
-Dinesh