历史上的今天
返回首页

历史上的今天

今天是:2025年01月19日(星期日)

正在发生

2020年01月19日 | msp430硬件II2C

2020-01-19 来源:eefocus

msp430系列硬件I2C操作24LC128程序


说明:24lc128为美信公司EEPROM存储器,存取空间为128kbit。具体的通信规则可以看其器件手册。 


***************************************************************************************/ 


运行代码

 

/*******************************************************************************  

包含头文件  

*******************************************************************************/  

#include   

/*******************************************************************************  

全局变量的定义  

*******************************************************************************/  

unsigned char RXData;  

unsigned char count;  

/*******************************************************************************  

函数定义  

*******************************************************************************/  

void IIC_init(void);                         // 初始化设置  

void EEPROM_Write(unsigned char high_Address,unsigned char low_Address,unsigned char Word);  

                                             // 字节写设置  

void EEPROM_radom(unsigned char high_Address,unsigned char low_Address);  

                                             // 随机读设置  

void EEPROM_read();                          // 连续读设置  

/*************************************************************************  

** 函数名称:  

** 工作环境:    

** 作者:      

** 生成日期:  

** 功能:STOP信号和START信号之间延时 5MS  

** 相关文件:  

** 修改日志:  

*************************************************************************/  

void Delay()  

{  

  for(unsigned char i=0;i<0xff;i++);  

  for(unsigned char i=0;i<0xff;i++);  

  for(unsigned char i=0;i<0xff;i++);  

  for(unsigned char i=0;i<0xff;i++);  

  for(unsigned char i=0;i<0xff;i++);  

}  

 

/*************************************************************************  

** 函数名称:  

** 工作环境:  

** 作者:      

** 生成日期:  

** 相关文件:  

** 修改日志:  

*************************************************************************/  

void main(void)  

{  

   

  WDTCTL = WDTPW + WDTHOLD;                 // 关闭看门狗  

  for(unsigned char i=0;i<0xff;i++);  

  IIC_init();                               // 初始化IIC  

  EEPROM_Write(0x01,0x00,0x10);             // 字节写  

  Delay();                                  // 延时  

  EEPROM_radom(0x01,0x00);                  // 随机读  

  EEPROM_read();                            // 立即读  

  LPM0;  

}  

/*************************************************************************  

** 函数名称:  

** 工作环境:  

** 作者:      

** 生成日期:  

** 功能:初始化I2C接口  

        传输方式设置,主从设置,波特率设置  

** 相关文件:  

** 修改日志:  

*************************************************************************/  

void IIC_init(void)  

{  

  P10SEL |= BIT1 + BIT2;  

  P10REN |= BIT1 + BIT2;  

  UCB3CTL1 |= UCSWRST;                      // 置位UCSWRST  

  UCB3CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C 主机, 同步 模式  

  UCB3CTL1 |= UCSSEL_2;                     // SMCLK  

  UCB3BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz  

  UCB3BR1 = 0;  

  UCB3I2CSA = 0x50;                         // 从机地址0x50  

  UCB3CTL1 &= ~UCSWRST;                     // 清除UCSWRST  

  UCB3IE |= UCRXIE;                         // 使能接收中断  

  _EINT();  

}  

 

/*************************************************************************  

** 函数名称:  

** 工作环境:  

** 作者:      

** 生成日期:  

** 功能:向相关的存储单元写入数据  

** 相关文件:  

** 修改日志:  

*************************************************************************/  

void EEPROM_Write(unsigned char high_Address,unsigned char low_Address,unsigned char Word)  

{  

  while (UCB3CTL1 & UCTXSTP);               // 确定总线空闲  

  UCB3CTL1 |= UCTXSTT + UCTR;               // 发送起始位,确定为发送模式  

  UCB3TXBUF = high_Address;                 // 发送高位地址  

  while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  

  UCB3TXBUF = low_Address;                  // 发送低位地址  

  while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  

  UCB3TXBUF = Word;                         // 发送数据  

  while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  

  UCB3CTL1 |= UCTXSTP;                      // 发送停止位  

  while((UCB3CTL1 & UCTXSTP)==1);           // 判断停止位是否发送完毕  

}  

  

/*************************************************************************  

** 函数名称:字节读函数  

** 工作环境:  

** 作者:      

** 生成日期:  

** 功能:     连续读发送设置  

** 相关文件:  

** 修改日志:  

*************************************************************************/  

void EEPROM_read()  

{  

  UCB3CTL1 &= ~UCTR;                       // 确定为读  

  while (UCB3CTL1 & UCTXSTP);              // 总线是否空闲  

  UCB3CTL1 |= UCTXSTT;                     // 发送开始位  

}  

  

/*************************************************************************  

** 函数名称:字节写函数  

** 工作环境:  

** 作者:      

** 生成日期:  

** 功能:     随机读发送设置  

** 相关文件:  

** 修改日志:  

*************************************************************************/  

void EEPROM_radom(unsigned char high_Address,unsigned char low_Address)  

{  

  while (UCB3CTL1 & UCTXSTP);               // Ensure stop condition got sent  

  UCB3CTL1 |= UCTXSTT + UCTR;               // 发送起始位,确定为写  

  UCB3TXBUF = high_Address;                 // 发送地址位高位  

  while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  

  UCB3TXBUF = low_Address;                  // 发送地址位低位  

  while((UCB3IFG & UCTXIFG)==0);            // 判断是否发送完毕  

  UCB3CTL1 &= ~UCTR;                        // 确定为接收  

  while (UCB3CTL1 & UCTXSTP);               // 判断总线是否被释放  

  UCB3CTL1 |=UCTXSTT;                       // 重新发送起始位  

  while((UCB3CTL1 & UCTXSTT)==1);           // 判断起始位是否发送成功  

  for(unsigned char i=0x0;i<0x2f;i++);      // 延时确定数据已经被发送出去  

  UCB3CTL1 |=UCTXSTP + UCTXNACK;            // 发送停止位和NACK位  

}  

  

/*************************************************************************  

** 函数名称:接收中断函数  

** 工作环境:  

** 作者:      

** 生成日期:  

** 功能:    存取接收的数据  

** 相关文件:  

** 修改日志:  

*************************************************************************/  

#pragma vector = USCI_B3_VECTOR  

__interrupt void USCIAB3_ISR(void)  

{  

  if(UCB3IFG  & UCRXIFG)                     // 接收中断  

  {  

   count++;  

推荐阅读

史海拾趣

Armel Electronics Inc公司的发展小趣事

在电子行业中,技术更新迅速,创新是企业持续发展的动力。Armel Electronics Inc公司始终将研发创新作为公司的核心竞争力。公司不断投入资金,引进先进设备和技术,加强研发团队的建设。通过不断创新,Armel成功推出了一系列具有行业领先水平的新产品,为公司的持续发展提供了有力保障。

灿科盟(Ckmtw)公司的发展小趣事

灿科盟电子实业有限公司成立于2003年8月,注册资金100万。公司创始人凭借在电子行业多年的积累,决定创立自有品牌“CKMTW”,专注于连接器产品的研发与生产。在初创阶段,公司面临着资金紧张、市场竞争激烈等挑战,但凭借坚定的信念和不断的技术创新,逐渐在市场中站稳脚跟。

Epitex Inc公司的发展小趣事

Epitex非常重视企业文化的建设和团队精神的培育。他们倡导“创新、协作、务实、共赢”的价值观,鼓励员工积极创新、勇于挑战。同时,Epitex还注重员工关怀和福利待遇的提升,为员工提供良好的工作环境和发展空间。

在团队建设方面,Epitex注重培养员工的团队协作能力和沟通能力。他们定期组织团队活动和培训项目,增强团队的凝聚力和向心力。这种积极向上的企业文化和高效的团队协作为Epitex的持续发展提供了有力保障。

Greenwich Instruments Ltd公司的发展小趣事

Greenconn Corp自创立之初便致力于连接器技术的研发与创新。在20世纪末,随着电子产品的普及和通讯技术的飞速发展,连接器作为电子设备间的桥梁,其重要性日益凸显。Greenconn Corp凭借其敏锐的市场洞察力和强大的研发实力,成功研发出了一系列高性能、高可靠性的连接器产品,迅速在汽车电子、通信设备等领域占据了一席之地。这些创新产品不仅满足了市场对连接器高质量、高效率的需求,还推动了整个电子行业的发展。

ELECTRONIC ASSEMBLY公司的发展小趣事

在电子产业的浪潮中,一家名为“智汇电子组装”的初创公司凭借其独特的技术优势迅速崛起。公司创始人是一位资深的电子工程师,他带领着一支由多名技术精英组成的团队,专注于研发高效、精确的电子组装技术。通过不断创新和优化,智汇电子组装成功开发出一套自动化组装设备,大大提高了生产效率,降低了成本。凭借这一技术优势,公司逐渐在电子组装市场上崭露头角,赢得了众多客户的青睐。

优先(苏州)半导体公司的发展小趣事

宝士曼第三代半导体研发生产项目位于苏州东山大道旁,占地50亩,计划建设生产、研发、办公等楼宇。项目整体将分二期建成,总建筑面积约70000平方米。已经封顶的4号楼建筑面积超11600平方米,主要用于第三代半导体器件专用封装设备的研发生产。在施工过程中,宝士曼对环保和施工细节提出了更高的要求,要求地面每5平方米的高度误差要小于3毫米,并在施工中做到“工完场清”,最大程度减少对今后生产的影响。这种对细节的严格要求体现了宝士曼对产品质量和环保责任的重视。

问答坊 | AI 解惑

求助:STM32G431CBT6的PB8引脚如何重映射为I2C引脚

我的板子STM32G431CBT6的PB8-BOOT0引脚设计成与AT24C08设备连接,但是PB8默认是BOOT0功能,我是用STM32CubeMX生成的程序,但是工作不正常。即使不使用做I2C作为GPIO输出也是不工作地,我和论坛里的@damiaa都做了相同的实验,实验结果都是:无论程序 ...…

查看全部问答>

软件测试的工资大概是多少?

1.各公司对软件测试工作的重视程度   可看出大多数公司对软件测试工作还是重视的。 2.各公司对软件测试工程师的学历要求   可看出当前的行业中对软件测试工程师的学历要求主要 ...…

查看全部问答>

Profinet转RS485连接三项多功能电力仪表配置案例

本案例是使用Profinet转RS485网关连接三项多功能电力仪表的配置案例。 所需设备:西门子1200PLC一台、Profinet转RS485自由协议网关一台、三项多功能电力仪表一台; 1、使用方法,打开西门子博图配置软件,添加PLC; 2、导入Profinet转 ...…

查看全部问答>

Profinet转RS485连接三项多功能电力仪表配置案例

本案例是使用Profinet转RS485网关连接三项多功能电力仪表的配置案例。 所需设备:西门子1200PLC一台、Profinet转RS485自由协议网关一台、三项多功能电力仪表一台; 1、使用方法,打开西门子博图配置软件,添加PLC; 2、导入Profinet转 ...…

查看全部问答>

二极管BWA56烧坏,怀疑外部的感应电压,万用表测试最高55V左右,大神看有知道的吗

     这个二极管大多数的使用场合没有出现问题,个别使用场合出现二极管烧坏,整流和续流部分都坏了,短路或是开路,见上表, 测试外部输入有感应电压最高55V左右,长时间不稳定的外部感应电压会导致二极管烧坏吗?正常的有 ...…

查看全部问答>

P-CAD

P-CAD的KEY是多少了? …

查看全部问答>

关于优先编码器的设计问题

     书上在优先编码器这块更多的是从电路图分析到逻辑式再写出真值表,但往往在设计的时候先从逻辑出发写出真值表再写出逻辑式再化简。 疑问:我做为一个初学者实在对先出真值表(数据编码部分,控制部分S和控制输入状 ...…

查看全部问答>

e络盟限时福利|《e选》-------晒单

疫情这么严重,快递一点也不慢,的确很给力,买了几块stm32F0的板子, 一直居家,没事了,可以玩玩板子 …

查看全部问答>

【MPS商城钜惠体验季】开箱~~

看上这两个产品,刚好赶上MPS活动,速度下单。       到货速度很快,箱子出乎意料地大,对产品保护的很好。后续使用试试。       …

查看全部问答>

【贝能高性价比ATSAMD51评估板】MPLAB开发环境搭建体验

前言 前面我们体验了使用MDK进行开发,这次我们体验官方的开发环境,MPLAB X IDE+XC32编译器+MPLAB Harmony v3是官方提供的工具链。 准备资料包 http://www.burnon.com/ 服务支持->下载中心 下载资料包     安装MPLAB X IDE ...…

查看全部问答>