2841|10

639

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

[LPC54102] + 求助I2C接口 [复制链接]

       想用LPC54102驱动一个PCF8591的AD/DA模块,但是怎么都搞不定望大牛指点啊。。
       PCF8591通过I2C总线接口 先得写期间地址  0x90 (写操作) 或  0x91(读操作)

       先得写器件地址0X90表示写操作  然后写控制信息0X41

       然后写器件地址0X91表示读操作  然后读取AD采集的数值;

       本人写的代码如下照着官方代码写的怎么都调不出来

      while (1) {

                /* Write address, write 1 btye, read 8 bytes back */

                mXfer.slaveAddr = I2C_ADDR_7BIT;     // 器件地址0X90表示写操作

                tx[0] = 0x41;                                         //表示读取第一个AD通道的值,控制信息

                mXfer.txBuff = tx;

                mXfer.rxBuff = rx;

                mXfer.txSz = 1;

                mXfer.rxSz = 0;

       

                /* Start transfer and wait for completion */

                ROM_I2CM_Transfer(i2cmHandle, &mXfer);

               

  /*--------------------------------------------------------------*/

                mXfer.slaveAddr = I2C_ADDR_7BIT+1;              //器件地址0X91表示读操作

                mXfer.rxBuff = rx;

                mXfer.txSz = 0;

                mXfer.rxSz = 1;



                /* I2C master driver will block if blocking flag is used */

                //mXfer.flags = ROM_I2CM_FLAG_BLOCKING;



       

                /* Start transfer and wait for completion */

                ROM_I2CM_Transfer(i2cmHandle, &mXfer);
此帖出自单片机论坛

最新回复

不知道   详情 回复 发表于 2015-5-4 21:06
点赞 关注
 

回复
举报

639

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
崩溃了 都要
此帖出自单片机论坛
 
 

回复

7628

帖子

18

TA的资源

五彩晶圆(高级)

板凳
 
读写一次操作,不分两次。
把第二次的mXfer.rxSz = 1弄上去,然后第二次  /*--------------------------------------------------------------*/ 以下都删掉。
此帖出自单片机论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

5310

帖子

453

TA的资源

五彩晶圆(高级)

4
 
/****************************************************************************
* 函数名:
* 输入:
* 返回:
* 描述:
* ************************************************************************/
void Write_TMP006(unsigned char Reg_Address,unsigned char * data)
{
                 
                /* Write address, write 1 btye, read 8 bytes back */
                i2cmXfer.slaveAddr = I2C_ADDR_7BIT;
                tx[0] = Reg_Address;        //寄存器地址
                tx[1]=data[0];                //寄存器值 MSB
                tx[2]=data[1];                //寄存器值 LSB
         
                i2cmXfer.txBuff = tx;
                i2cmXfer.rxBuff = rx;
                i2cmXfer.txSz = 3;
                i2cmXfer.rxSz = 0;

                /* I2C master driver will block if blocking flag is used */
                i2cmXfer.flags = ROM_I2CM_FLAG_BLOCKING;

                /* Start transfer and wait for completion */
                ROM_I2CM_Transfer(i2cmHandle, &i2cmXfer);
  
}  
  /****************************************************************************
* 函数名:
* 输入:
* 返回:
* 描述:
* ************************************************************************/
void Read_TMP006(unsigned char Reg_Address,unsigned char *RxData )
{  
                /* Write address, write 1 btye, read 8 bytes back */
                i2cmXfer.slaveAddr = I2C_ADDR_7BIT;
                tx[0] = Reg_Address;        //寄存器地址
         
                i2cmXfer.txBuff = tx;
                i2cmXfer.rxBuff = rx;
                i2cmXfer.txSz = 1;
                i2cmXfer.rxSz = 2;

                /* I2C master driver will block if blocking flag is used */
                i2cmXfer.flags = ROM_I2CM_FLAG_BLOCKING;  
       
                /* Start transfer and wait for completion */
                ROM_I2CM_Transfer(i2cmHandle, &i2cmXfer);
       
          RxData[0]=rx[0];
          RxData[1]=rx[1];
}
此帖出自单片机论坛
 
 
 

回复

5310

帖子

453

TA的资源

五彩晶圆(高级)

5
 
float Read_TMP(void)
{
        unsigned char RxData[2] ;
        _ui2uc ui2uc;
        float temp=0;
        //制造商ID寄存器        5449h
        Read_TMP006(Manufacturer_ID_REG,&RxData[0]);
       
        do
        {
                //读配置寄存器
                Read_TMP006(CONF_REG,&RxData[0]);
        }while((RxData[0]&0x08)!=0x08);
        //
        Read_TMP006(TEMPERATURE_REG,&RxData[0]);
        ui2uc.ucdata[1]=RxData[0];
        ui2uc.ucdata[0]=RxData[1];
         
       
        temp=(ui2uc.uidata>>2)*0.03125;
       
        return temp;
}
此帖出自单片机论坛

点评

知不知道LPC i2c里边那个函数可以读取应答信号  详情 回复 发表于 2015-5-4 20:24
有几点不解,在多读取寄存器时,写发送器件地址最后一位是0表示写操作,然后发送寄存器地址,然后读取数据对吧。但是在写过寄存器地址以后是不是得再次写器件地址并且最后一位应该是1等待器件相应然后才读取数据。之  详情 回复 发表于 2015-5-4 12:52
 
 
 

回复

5310

帖子

453

TA的资源

五彩晶圆(高级)

6
 
楼主就差一步了!

此帖出自单片机论坛
 
 
 

回复

639

帖子

0

TA的资源

一粒金砂(高级)

7
 


有几点不解,在多读取寄存器时,写发送器件地址最后一位是0表示写操作,然后发送寄存器地址,然后读取数据对吧。但是在写过寄存器地址以后是不是得再次写器件地址并且最后一位应该是1等待器件相应然后才读取数据。之前没搞过i2c。
然后,lpc例子只是调用一个函数它读写之间是否会再次发送器件地址??
此帖出自单片机论坛

点评

要发送,只是封装到一起了。  详情 回复 发表于 2015-5-4 13:09
 
 
 

回复

7628

帖子

18

TA的资源

五彩晶圆(高级)

8
 
908508455a 发表于 2015-5-4 12:52
有几点不解,在多读取寄存器时,写发送器件地址最后一位是0表示写操作,然后发送寄存器地址,然后读取数据对吧。但是在写过寄存器地址以后是不是得再次写器件地址并且最后一位应该是1等待器件相应然后才读取数据。之前没搞过i2c。
然后,lpc例子只是调用一个函数它读写之间是否会再次发送器件地址??

要发送,只是库封装到一起了。
此帖出自单片机论坛

点评

那不是只能通过我上边的那样分两次发送吗???  详情 回复 发表于 2015-5-4 19:42
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

639

帖子

0

TA的资源

一粒金砂(高级)

9
 
freebsder 发表于 2015-5-4 13:09
要发送,只是库封装到一起了。

那不是只能通过我上边的那样分两次发送吗???
此帖出自单片机论坛
 
 
 

回复

639

帖子

0

TA的资源

一粒金砂(高级)

10
 
蓝雨夜 发表于 2015-5-4 08:06
float Read_TMP(void)
{
        unsigned char RxData[2] ;
        _ui2uc ui2uc;
        float temp=0;
        //制造商ID寄存器        5449h
        Read_TMP006(Manufacturer_ID_REG,&RxData[0]);
       
        do
        {
                //读配置寄存器
                Read_TMP006(CONF_REG,&RxData[0]);
        }while((RxData[0]&0x08)!=0x08);
        //
        Read_TMP006(TEMPERATURE_REG,&RxData[0]);
        ui2uc.ucdata[1]=RxData[0];
        ui2uc.ucdata[0]=RxData[1];
         
       
        temp=(ui2uc.uidata>>2)*0.03125;
       
        return temp;
}

知不知道LPC  i2c里边那个函数可以读取应答信号
此帖出自单片机论坛

点评

不知道  详情 回复 发表于 2015-5-4 21:06
 
 
 

回复

5310

帖子

453

TA的资源

五彩晶圆(高级)

11
 
908508455a 发表于 2015-5-4 20:24
知不知道LPC  i2c里边那个函数可以读取应答信号

不知道
此帖出自单片机论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表