历史上的今天
今天是: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++;
上一篇:MSP430捕获器简单实用
史海拾趣
|
求助:STM32G431CBT6的PB8引脚如何重映射为I2C引脚 我的板子STM32G431CBT6的PB8-BOOT0引脚设计成与AT24C08设备连接,但是PB8默认是BOOT0功能,我是用STM32CubeMX生成的程序,但是工作不正常。即使不使用做I2C作为GPIO输出也是不工作地,我和论坛里的@damiaa都做了相同的实验,实验结果都是:无论程序 ...… 查看全部问答> |
|
1.各公司对软件测试工作的重视程度 可看出大多数公司对软件测试工作还是重视的。 2.各公司对软件测试工程师的学历要求 可看出当前的行业中对软件测试工程师的学历要求主要 ...… 查看全部问答> |
|
本案例是使用Profinet转RS485网关连接三项多功能电力仪表的配置案例。 所需设备:西门子1200PLC一台、Profinet转RS485自由协议网关一台、三项多功能电力仪表一台; 1、使用方法,打开西门子博图配置软件,添加PLC; 2、导入Profinet转 ...… 查看全部问答> |
|
本案例是使用Profinet转RS485网关连接三项多功能电力仪表的配置案例。 所需设备:西门子1200PLC一台、Profinet转RS485自由协议网关一台、三项多功能电力仪表一台; 1、使用方法,打开西门子博图配置软件,添加PLC; 2、导入Profinet转 ...… 查看全部问答> |
|
二极管BWA56烧坏,怀疑外部的感应电压,万用表测试最高55V左右,大神看有知道的吗 这个二极管大多数的使用场合没有出现问题,个别使用场合出现二极管烧坏,整流和续流部分都坏了,短路或是开路,见上表, 测试外部输入有感应电压最高55V左右,长时间不稳定的外部感应电压会导致二极管烧坏吗?正常的有 ...… 查看全部问答> |
|
书上在优先编码器这块更多的是从电路图分析到逻辑式再写出真值表,但往往在设计的时候先从逻辑出发写出真值表再写出逻辑式再化简。 疑问:我做为一个初学者实在对先出真值表(数据编码部分,控制部分S和控制输入状 ...… 查看全部问答> |
|
【贝能高性价比ATSAMD51评估板】MPLAB开发环境搭建体验 前言 前面我们体验了使用MDK进行开发,这次我们体验官方的开发环境,MPLAB X IDE+XC32编译器+MPLAB Harmony v3是官方提供的工具链。 准备资料包 http://www.burnon.com/ 服务支持->下载中心 下载资料包 安装MPLAB X IDE ...… 查看全部问答> |




