社区导航

 

搜索
查看: 972|回复: 6

[经验] TMS570LS1224的 I2C的使用

[复制链接]

16

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-9-19 14:57 | 显示全部楼层 |阅读模式

最近使用到MCP4725,这是一款12bit的dac芯片,MCU通过I2C发送控制信息控制dac的电平输出,输出范围取决于VCC,具体资料查看参考手册(包含地址信息、控制字、和帧信息等)。

在HAL配置如下:

image.png

代码如下:

 i2cREG1->MDR |= (uint32)I2C_STOP_COND;
 i2cREG1->MDR |= 0x2400;//I2C START

 i2cSendByte(i2cREG1,0x60);//COMFIG

i2cSendByte(i2cREG1,0x50);

  i2cSendByte(i2cREG1,0x00);//SEND DATA
   i2cREG1->MDR |= (uint32)I2C_STOP_COND;//I2C END

需要注意的是,在程序中7位从机地址通过 i2cSetSlaveAdd 函数设置,通过设置输入或输出模式自动补全读写位,在数据的第一个字节发送。可以通过示波器查看发送波形,可以很明显的看到在第九个时序sda信号线上出现一个脉冲信号,这就是应答信号,只有收到应答信号I2C才会将下一个字节信息发送。

MCP4725中文.pdf

1.61 MB, 下载次数: 5

main.txt

4.3 KB, 下载次数: 9


回复

使用道具 举报

16

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-12-3 09:35 | 显示全部楼层

i2cSetSlaveAdd(i2cREG1, 0x60);

           i2cSetDirection(i2cREG1, I2C_TRANSMITTER);

           i2cSetStop(i2cREG1);

           i2cREG1->MDR |= 0x2400;

           i2cSendByte(i2cREG1,0x60);
           ////  C2  C1  C0        PD1  PD0
           ///   0   1   1         0    0 
           ///   写入寄存器与EEPROM    正常关断模式

           i2cSendByte(i2cREG1,0x7f);

           i2cSendByte(i2cREG1,0xf0);


           i2cSetStop(i2cREG1);
主要程序如上,比txt文档简洁,配合4725文档使用更佳。


回复

使用道具 举报

2083

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2019-12-5 08:46 | 显示全部楼层

谢谢分享,好经典啊。


回复

使用道具 举报

24

TA的帖子

2

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2020-1-7 10:52 | 显示全部楼层

你好想问下 我用的函数是i2cSend

然后一直卡在while ((i2c->STR & (uint32)I2C_TX_INT) == 0U)这里了

不知道什么原因呢


回复

使用道具 举报

16

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2020-3-26 16:48 | 显示全部楼层
三不沾 发表于 2020-1-7 10:52 你好想问下 我用的函数是i2cSend 然后一直卡在while ((i2c->STR & (uint32)I2C_TX_INT) == 0U) ...

image.png

复用这里您设置了吗?如果设置了可以调试里面看一下寄存器参数,卡在这里应该是没有收到ACK信号。

不好意思很久没有登录,回答有点晚,希望您已经解决问题了。


回复

使用道具 举报

2083

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2020-3-27 14:40 | 显示全部楼层

谢谢分享,


回复

使用道具 举报

16

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2020-4-1 15:47 | 显示全部楼层
三不沾 发表于 2020-1-7 10:52 你好想问下 我用的函数是i2cSend 然后一直卡在while ((i2c->STR & (uint32)I2C_TX_INT) == 0U) ...

再次回复,因为I2C_TX_INT = 16(可以查看定义),所以while()的意义在于查看i2c->STR第四位 即TXRDY位的值,通过查看数据手册,TXRDY = 1,代表数据发送寄存器I2CDXR为空(上一个数据已发送),=0代表 上一个数据仍未发送。所以当前数据无法发送。

总结:卡在这里的原因是上一个数据未发送,所以您需要检查从机地址、发送模式等,具体参考HAL->help->example->您使用的芯片文件夹->i2c*.c。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/4 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-4-5 14:28 , Processed in 0.227904 second(s), 18 queries , Gzip On, MemCache On.

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