MSP430F149模拟IIC读写24C02程序
板子上设置了EEPROM存储器,型号为AT24C02。
板子的硬件连接为:SCL--->P2.4,SDA--->P2.5。
直接了当,贴上程序!
========================24cxx.h文件========================= #ifndef _24CXX_H_ #define _24CXX_H_ #include <msp430x14x.h> #define WRITE_ADDR 0xA0 //A0 A1 A2均接地 #define READ_ADDR 0xA1 //A0 A1 A2均接地 #define SDA_BIT BIT5 #define SCL_BIT BIT4 #define IIC_PORT_DIR P2DIR #define IIC_PORT_DATA P2OUT #define SDA_BIT_DATA (P2IN & BIT5) #define SDA_OUT (IIC_PORT_DIR |= SDA_BIT) #define SDA_IN (IIC_PORT_DIR &= ~SDA_BIT) #define SDA_1 (IIC_PORT_DATA |= SDA_BIT) #define SDA_0 (IIC_PORT_DATA &= ~SDA_BIT) #define SCL_IN (IIC_PORT_DIR &= ~SCL_BIT) #define SCL_OUT (IIC_PORT_DIR |= SCL_BIT) #define SCL_1 (IIC_PORT_DATA |= SCL_BIT) #define SCL_0 (IIC_PORT_DATA &= ~SCL_BIT) void init_iic(void); void iic_start(void); void iic_stop(void); void iic_ack(void); void iic_no_ack(void); unsigned char iic_test_ack(void); void iic_write(unsigned char data); unsigned char iic_read(void); unsigned char iic_write_data(unsigned char StartAddress,unsigned char *date,unsigned char bytes); unsigned char iic_read_data(unsigned char StartAddress,unsigned char *date,unsigned char bytes); #endif
========================24cxx.c文件========================= #include "24cxx.h" #include "main.h" //实际上需要包含延时#define CPU_F ((double)8000000) //#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) //#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) /* *IIC端口初始化 */ void init_iic(void) { SCL_OUT; //SCL管脚为输出 SDA_IN; //SDA管脚为输入 SCL_0; iic_stop(); } /* *IIC起始状态 */ void iic_start(void) { SDA_OUT; SDA_1; delay_us(); SCL_1; delay_us(); SDA_0; delay_us(); SCL_0; delay_us(); } /* *IIC停止状态 */ void iic_stop(void) { SDA_OUT; SCL_0; delay_us(); SDA_0; delay_us(); SCL_1; delay_us(); SDA_1; delay_us(); } /* *IIC应答 */ void iic_ack(void) { SDA_OUT; SDA_0; delay_us(); SCL_1; delay_us(); SCL_0; delay_us(); SDA_1; } /* *IIC无应答 */ void iic_no_ack(void) { SDA_OUT; SDA_1; delay_us(); SCL_1; delay_us(); SCL_0; delay_us(); } /* *IIC检测回应 */ unsigned char iic_test_ack(void ) { unsigned char tmp; SDA_IN; //设为输入 delay_us(); SCL_1; delay_us(); tmp = SDA_BIT_DATA>>; delay_us(); SCL_0; delay_us(); return(tmp); } /* *IIC写字节 */ void iic_write(unsigned char data) { SDA_OUT; unsigned char i,temp; ; i<; i++) { SDA_OUT; temp = data&0x80; if(temp == 0x80) SDA_1; //判断发送位,送数据到数据线上 else SDA_0; delay_us(); SCL_1; //置时钟信号为高电平,使数据有效 delay_us(); SCL_0; delay_us(); data=data<<; } SDA_IN; delay_us(); } /* *IIC读字节 */ unsigned char iic_read(void) { unsigned char i,tmp; unsigned ; SDA_IN; //置数为输入 ; i<; i++) { SCL_1; delay_us(); ; SDA_IN; tmp = SDA_BIT_DATA; if(tmp == SDA_BIT) byte = (byte|0x01); delay_us(); SCL_0; delay_us(); } return(byte); } /* *IIC写数据 *输入:start_addr起始地址 * n_bytes写入字节数 * dest_date写入的数据源 *输出:无 */ unsigned char iic_write_data(unsigned char start_addr, unsigned char *dest_date, unsigned char n_bytes) { unsigned ; iic_start(); //启动IIC iic_write(WRITE_ADDR); //写24C02地址以 ) //检测应答 ; iic_write(start_addr); //写对24C02操作的地址 ) ; ; i<n_bytes; i++) { iic_write(*dest_date); //向24C02中写数据 ) ; dest_date++; start_addr++; } iic_stop(); ; } /* *IIC读数据 *输入:start_addr起始地址 * n_bytes读出字节数 *输出:dest_date读出并保存的数据目的 */ unsigned char iic_read_data(unsigned char start_addr, unsigned char *dest_date, unsigned char n_bytes) { unsigned char i; iic_start(); iic_write(WRITE_ADDR); ) ; iic_write(start_addr); ) ; iic_start(); iic_write(READ_ADDR); ) ; ; i<n_bytes; i++) { *dest_date = iic_read(); iic_ack(); dest_date++; } *dest_date = iic_read(); iic_no_ack(); iic_stop(); ; }
测试结果采用串口输出方式,main包含下面的步骤。
unsigned ] = {],ret = ; init_iic(); printf("24c02 iic init ok\r\n"); printf(],iic_buf[],iic_buf[],iic_buf[]); ret = iic_write_data(,iic_buf,); printf( ? "err" : "ok"); ret = iic_read_data(,iic_rdbuf,); printf( ? "err" : "ok"); printf(],iic_rdbuf[],iic_rdbuf[],iic_rdbuf[]);
实际测试显示:
/* 页写函数,写入起始地址,数据,字节数 */ unsigned char EepromPageWrite(EEPROM_ADDR_TYPE address, unsigned char *pdata, unsigned char num) { unsigned ; //计算起始页 unsigned ; //计算结束页-1 unsigned ; //页写总循环数 unsigned char pagebyte; //页剩余字节数寄存器 unsigned ; pagestart = EEPROM_PAGE_CAL(address); //at24c01,02 pageend = EEPROM_PAGE_CAL(address+num-); //页写 ; pageloop <= (pageend-pagestart); pageloop++) { //计算本次写入的字节数 pagebyte = (address|(EEPROM_PAGE_SIZE-)) - address + ; if (num <= pagebyte) pagebyte = num; num -= pagebyte; //剩余字节数 I2cSendStart(); == I2cSendByte(EEPROM_WRITE)) ); ... }
MSP430F149模拟IIC读写24C02程序的更多相关文章
- 移植并修改成功的模拟iic读写EEPROM at24c02
2010-04-24 12:58:00 注:如果要读24c128或264,地址位为16位的.现在的地址位为8位. protues仿真图 源程序如下: #include <iom16v.h> ...
- 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)
版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...
- STM32F10X -- 模拟IIC程序
听说STM32的IIC硬件做的很鸡肋,所以在这里通过模拟的方式实现IIC协议.此程序能成功对AT24C02操作. 程序中的带参数宏 IIC_DELAY(time)的功能是延时time us,在实际中具 ...
- STM32F10x_模拟I2C读写EEPROM
Ⅰ.写在前面 说到IIC,大家都应该不会陌生,我们初学单片机的时候或多或少都知道或了解过,甚至使用I2C控制过器件.但是,有多少人真正去深入理解,或者深入研究过I2C通信协议呢? 1.我们有必要学习I ...
- stm32软件模拟IIC读取PX4FLOW光流传感器数据
这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模 ...
- STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)
推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来! http://www.captainbed.net/strongerhuang Ⅰ.写在前 ...
- 模拟IIC总线多设备挂载(12864OLED屏幕+GY30光照传感器)
最终效果展示 OLED屏幕和GY30光照传感器(BH1750FVI)都连接在一个IIC(I2C)总线上,所以只需要接4根线即可.获取到的光照强度可以在OLED上实时显示并通过串口打印.IIC是IO模拟 ...
- C51—模拟IIC总线实现EEPROM存取数据
a - 什么是IIC总线 -什么是EEPROM -IIC总线的通信格式 模块化设计注解 整体代码 - 什么是IIC总线 IIC总线是同步通信的一种特殊形式,具有接线口少.控制简单.器件封装形式小.通信 ...
- GPIO模拟IIC接口信号质量分析
信号质量有问题的波形001: 信号质量有问题的波形002: 从上图可以看出,GPIO口模拟的I2C接口,电平都存在半高的情况. 因为I2C的接口是通过GPIO模拟实现的,该时钟信号线SCL内部默认为下 ...
随机推荐
- CS找工作好文章
我的美国CS面试经验分享 -- 转载 怎样花两年时间去面试一个人 上面列出了一些比较好的书单 cs土硕找工作总结(二) 笔试面试准备http://blog.renren.com/blog/221227 ...
- 在CentOS上安装FFMPEG和Gstream-ffmpeg
当我们用CentOS7自带的源时,是yum search不到标题上述的两个相关的包的,而opencv需要用到FFmpeg读取视频文件.这就必须安装了. 可以参考FFMPEG官方给出的文档: http: ...
- 【转】Git与Repo入门----不错
原文网址:http://www.cnblogs.com/angeldevil/p/3238470.html Git与Repo入门 版本控制 版本控制是什么已不用在说了,就是记录我们对文件.目录或工 ...
- cf448B Suffix Structures
B. Suffix Structures time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 商派shopex
http://www.shopex.cn/48release/shopexsingle_exper.php 在线体验 前台体验:http://demo.shopex.com.cn/485 后台体验:h ...
- js实现a标签超链接提交form表单的方法
<a class="regButton" id="saveRegister" onclick="document.getElementBy ...
- 修改UISearchBar输入框字体颜色
UITextField *searchField = [mySearchBar valueForKey:@"_searchField"]; searchField.textColo ...
- maven 工作原理和添加jar包技巧
相 信只要做过 Java 开发的童鞋们,对 Ant 想必都不陌生,我们往往使用 Ant 来构建项目,尤其是涉及到特别繁杂的工作量,一个 build.xml 能够完成编译.测试.打包.部署等很多 ...
- Gym Class(拓扑排序)
Gym Class Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- Apache与tomcat
联系 1)Apache和tomcat都是web网络服务器 2)Apache是普通的服务器,本身支持html即普通网页,可以通过插件支持php也可以与Tomcat连通 (Apache单向连接tomca ...