发 帖  
原厂入驻New
[问答] 用TM4C129X 开发板和板子自带外设TMP100进行I2C通信?
2020-8-26 13:29:48  25 TM4C129X
分享
小弟用TM4C129X 开发板和板子自带外设TMP100进行I2C通信,把ti给的例程按照板子对应借口修改了下,但是示波器显示SCL时钟和SDA数据显示一直无输出,不知道问题出在哪里,请各位指教
0
2020-8-26 13:29:48   评论 分享淘帖
5 个讨论
看你的程序,用的是I2C6这个接口,TM4C129x有I2C6么?貌似没这么多I2C接口吧。你可以先用IO模拟,读出来再进行硬件通讯。SDA没数据可以理解,SCL没数据,那就说明初始化都是错误的。
2020-8-26 13:48:44 评论

举报

因為System Clock沒設定好, 所以I2C也就沒有Clock, 當然就量不到輸出囉. TI的範例程序SysCtlClockSet()這是給TM4C123用的, TM4C129應該用SysCtlClockFreqSet(), 兩者不一樣, 看一下TivaWare™ Peripheral Driver Library USER’S GUIDE有寫喔!
2020-8-26 14:05:04 评论

举报

sulidudu 发表于 2020-8-26 14:05
因為System Clock沒設定好, 所以I2C也就沒有Clock, 當然就量不到輸出囉. TI的範例程序SysCtlClockSet()這是給TM4C123用的, TM4C129應該用SysCtlClockFreqSet(), 兩者不一樣, 看一下TivaWare™ Peripheral Driver Library USER’S GUIDE有寫喔!

太坑了,你系统都没振起来。压根就没往那方面去想,一看就是直接改例程的,都不直接测试下IO看看是否可以系统跑起来不
2020-8-26 14:18:28 评论

举报

sulidudu 发表于 2020-8-26 14:05
因為System Clock沒設定好, 所以I2C也就沒有Clock, 當然就量不到輸出囉. TI的範例程序SysCtlClockSet()這是給TM4C123用的, TM4C129應該用SysCtlClockFreqSet(), 兩者不一樣, 看一下TivaWare™ Peripheral Driver Library USER’S GUIDE有寫喔!

谢谢 看了手册  的确初始化不一样
2020-8-26 14:31:55 评论

举报

ljmlvmd 发表于 2020-8-26 13:48
看你的程序,用的是I2C6这个接口,TM4C129x有I2C6么?貌似没这么多I2C接口吧。你可以先用IO模拟,读出来再进行硬件通讯。SDA没数据可以理解,SCL没数据,那就说明初始化都是错误的。

按照如下程序写的话,读出来高位109,低位255,和TMP100手册不符,手册说低字节的低四位缺省为0,。目前怀疑I2CMasterControl( I2C6_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH ); //start+从机地址+主机数据+stop传输  写早了,注释掉后,高字节输出109 低字节也输出109,感觉读的不是正确的温度值,错误在哪里呢?


// 使能I2C模块及对应控制引脚端口
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C6);
// 配置相应控制端口
GPIOPinConfigure(GPIO_PB6_I2C6SCL);
GPIOPinConfigure(GPIO_PB7_I2C6SDA);
GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_6);
GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_7);
// 设置I2C模块传输速率
I2CMasterInitExpClk(I2C6_BASE, ui32SysClock, ture);
I2CMasterEnable(I2C6_BASE);
ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480), 120000000);
I2CMasterSlaveAddrSet( I2C6_BASE, 0x4A, true); //控制传输方向为主机写
I2CMasterDataPut( I2C6_BASE, 0x01 ); //写入主机数据(TMP100控制寄存器地址)
I2CMasterControl( I2C6_BASE, I2C_MASTER_CMD_BURST_SEND_START ); //start+从机地址+主机数据传输
while( I2CMasterErr(I2C6_BASE) | I2CMasterBusy(I2C6_BASE) );
I2CMasterDataPut( I2C6_BASE, 0xED ); //写入主机数据(TMP100控制寄存器内容)
I2CMasterControl( I2C6_BASE, I2C_MASTER_CMD_BURST_SEND_CONT ); //主机数据传输
while( I2CMasterErr(I2C6_BASE) | I2CMasterBusy(I2C6_BASE) );
delay_ms(35);
I2CMasterDataPut( I2C6_BASE, 0x00 ); //读取温度
I2CMasterControl( I2C6_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH ); //start+从机地址+主机数据+stop传输
while( I2CMasterErr(I2C6_BASE) | I2CMasterBusy(I2C6_BASE) );
delay_ms(25);
I2CMasterSlaveAddrSet( I2C6_BASE, 0x4A, true); //控制传输方向为主机写
I2CMasterControl( I2C6_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START );
while( I2CMasterErr(I2C6_BASE) | I2CMasterBusy(I2C6_BASE) );
Result_H = I2CMasterDataGet( I2C6_BASE );
delay_ms(325);
I2CMasterControl( I2C6_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH ); //start+从机地址+主机数据+stop传输
while( I2CMasterErr(I2C6_BASE) | I2CMasterBusy(I2C6_BASE) );
delay_ms(325);
Result_L = I2CMasterDataGet( I2C6_BASE ); //读出转换结果的低八位
delay_ms(325);
2020-8-26 14:49:51 评论

举报

只有小组成员才能发言,加入小组>>

1450个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表