16539|3

5304

帖子

454

TA的资源

五彩晶圆(高级)

楼主
 

ADUC7060 之I2C [复制链接]

/******************************************************************************
            I2C 主机寄存器
I2CMCON (I2C 主机控制寄存器)
I2CMSTA (I2C 主机状态寄存器)
I2CMRX  (I2C 主机接收寄存器)
I2CMTX  (I2C 主机发送寄存器)
I2CMCNT0(I2C 主机读取计数寄存器)
I2CMCNT1(I2C 主机当前读取计数寄存器)
I2CADR0 (I2C 地址0 寄存器)
I2CADR1 (I2C 地址1 寄存器)
I2CDIV  (I2C 主机时钟控制寄存器)
            I2C 从机寄存器 
I2CSCON (I2C 从机控制寄存器)
I2CSSTA (I2C 从机状态寄存器)
I2CSRX  (I2C 从机接收寄存器)
I2CSTX  (I2C 从机发送寄存器)
I2CALT  (I2C 硬件广播识别寄存器)
I2CIDx  (I2C 从机ID 寄存器)

            I2C 公共寄存器 
I2CFSTA(I2C FIFO 状态寄存器)
******************************************************************************/
void Init_I2C(void)
{
        
 I2CMCON=I2CMCENI(1)     |//I2C 发送完成中断使能位。将该位置1,则当从I2C 总线上检测到停止条件时,产生中断。清除该中断源。
                I2CNACKENI(1)   |//I2C 非应答信号(NACK)接收中断使能位。置1,则当I2C 主机接收到非应答信号时,产生中断。清除该中断源。
                I2CALENI(0)     |//I2C 仲裁失效中断使能位。置1,则当I2C 主机没有获得对I2C 总线的控制权时,产生中断。清除该中断源。
                I2CMTENI(1)     |//I2C 发送中断使能位。置1,则当I2C 主机完成一个字节的传输后,产生中断。清除该中断源。
                I2CMRENI(1)     |//I2C 接收中断使能位。置1,则当I2C 主机接收到数据时,产生中断。用户清0,则在I2C 主机接收数据的过程中,禁用中断。
                I2CMSEN(0)      |//I2C 主机SCL 伸展使能位。置1,可使能时钟延展功能。当SCL 处于低电平状态,置1,可强制器件在I2CMSEN 被清0 之前让SCL 保持低电平状态。当SCL 处于高电平状态,置1,可强制器件在下一个下降沿后让SCL 保持低电平状态。该位清0,可禁用时钟延展功能。
                I2CILEN(0)      |//I2C 内部回送使能位。该位置1,可以使能回送测试模式。在该模式下,SCL 和SDA 信号在内部分别与各自的输入信号相连。用户清0,可禁用回送模式。
                I2CBD(0)        |//I2C 主机撤回禁用位。置1,可允许器件与另一器件争夺对总线的控制权(即使另一个器件正在产生一个起始条件)。清0,则在I2C 总线释放,执行撤回。
                I2CMEN(1)       ;//I2C 主机使能位。用户置1,使能I2C 主机模式。用户清0,禁用I2C 主机模式。

 I2CDIV  = DIVH(0x31)|DIVL(0x31);// Select 100.3kHz clock rate
 IRQEN |= BIT15 ;//+ BIT13; // Enable I2C Master and XIRQ0 interrupts

 
}

此帖出自模拟电子论坛

最新回复

你好,想请教您关于ADCU7026的硬件I2C读写程序的问题,我用7026读加速度计LIS35DE一直不对,卡死在while((I2C1FSTA & 0x30)!=0x00){},这一步,不知道这个硬件I2C到底怎么用,下面是我的写和读的函数 void I2C_write(unsigned char Sads, unsigned char Dads, int d){          I2C1MTX=Dads;         I2C1ADR=Sads; while((I2C1FSTA & 0x30)!=0x00){}         I2C1MTX=d; while((I2C1FSTA & 0x30)!=0x00){} I2C1CCNT=0x80; } void I2C_read(unsigned char Sads,unsigned char Dads) { I2C1MTX=Dads; I2C1ADR=Sads; while ((I2C1FSTA&0xC0)!=0x00){} delay(4000); I2C1CNT=count; I2C1ADR=Sads+1;         if((I2C0MSTA & 0x8) == 0x8)                                           {                 dat= I2C1MRX;                 putchar(0xff);         } } 希望能帮忙看一下,十分感谢[em:2:]  详情 回复 发表于 2017-5-8 16:32
点赞 关注

回复
举报

5304

帖子

454

TA的资源

五彩晶圆(高级)

沙发
 
宏定义

/******************************************************************************
            I2C
******************************************************************************/

#define I2CMCENI(x)     x<<8    //I2C 发送完成中断使能位。将该位置1,则当从I2C 总线上检测到停止条件时,产生中断。清除该中断源。
#define I2CNACKENI(x)   x<<7    //I2C 非应答信号(NACK)接收中断使能位。置1,则当I2C 主机接收到非应答信号时,产生中断。清除该中断源。
#define I2CALENI(x)     x<<6    //I2C 仲裁失效中断使能位。置1,则当I2C 主机没有获得对I2C 总线的控制权时,产生中断。清除该中断源。
#define I2CMTENI(x)     x<<5    //I2C 发送中断使能位。置1,则当I2C 主机完成一个字节的传输后,产生中断。清除该中断源。
#define I2CMRENI(x)     x<<4    //I2C 接收中断使能位。置1,则当I2C 主机接收到数据时,产生中断。用户清0,则在I2C 主机接收数据的过程中,禁用中断。
#define I2CMSEN(x)      x<<3    //I2C 主机SCL 伸展使能位。置1,可使能时钟延展功能。当SCL 处于低电平状态,置1,可强制器件在I2CMSEN 被清0 之前让SCL 保持低电平状态。当SCL 处于高电平状态,置1,可强制器件在下一个下降沿后让SCL 保持低电平状态。该位清0,可禁用时钟延展功能。
#define I2CILEN(x)      x<<2    //I2C 内部回送使能位。该位置1,可以使能回送测试模式。在该模式下,SCL 和SDA 信号在内部分别与各自的输入信号相连。用户清0,可禁用回送模式。
#define I2CBD(x)        x<<1    //I2C 主机撤回禁用位。置1,可允许器件与另一器件争夺对总线的控制权(即使另一个器件正在产生一个起始条件)。清0,则在I2C 总线释放,执行撤回。
#define I2CMEN(x)       x<<0    //I2C 主机使能位。用户置1,使能I2C 主机模式。用户清0,禁用I2C 主机模式。

#define DIVH(x)         x<<8    //控制SCL 高电平周期的持续时间。
#define DIVL(x)         x<<0    //控制SCL 低电平周期的持续时间。
此帖出自模拟电子论坛
 
 

回复

1万

帖子

16

TA的资源

版主

板凳
 

不错,顶下

此帖出自模拟电子论坛
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
你好,想请教您关于ADCU7026的硬件I2C读写程序的问题,我用7026读加速度计LIS35DE一直不对,卡死在while((I2C1FSTA & 0x30)!=0x00){},这一步,不知道这个硬件I2C到底怎么用,下面是我的写和读的函数

void I2C_write(unsigned char Sads, unsigned char Dads, int d){       
  I2C1MTX=Dads;
        I2C1ADR=Sads;
while((I2C1FSTA & 0x30)!=0x00){}
        I2C1MTX=d;
while((I2C1FSTA & 0x30)!=0x00){}
I2C1CCNT=0x80;
}


void I2C_read(unsigned char Sads,unsigned char Dads)
{
I2C1MTX=Dads;
I2C1ADR=Sads;
while ((I2C1FSTA&0xC0)!=0x00){}
delay(4000);
I2C1CNT=count;
I2C1ADR=Sads+1;
        if((I2C0MSTA & 0x8) == 0x8)                                  
        {
                dat= I2C1MRX;
                putchar(0xff);
        }
}

希望能帮忙看一下,十分感谢[em:2:]
此帖出自模拟电子论坛
 
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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