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内部默认为下 ...
随机推荐
- 考查嵌入式C开发人员的最好的16道题
约定: 1) 下面的测试题中,认为所有必须的头文件都已经正确的包含了 2)数据类型 char 一个字节 1 byte int 两个字节 2 byte ( ...
- keil 中用函数指针调用函数的参数限制
NSIC中,通过函数指针调用的函数的参数的个数没有限制,但是KeilC对此有限制,至多3个参数.因为,KeilC编译时,无法通过函数指针找到该函数的局部数据段,也就无法通过局部数据段传递参数,只能通过 ...
- 简述tcp协议对http性能的影响及优化
当网站服务器并发连接达到一定程度时,你可能需要考虑服务器系统中tcp协议设置对http服务器的影响. tcp相关延时主要包括: 1.tcp连接时建立握手: 2.tcp慢启动拥塞控制: 3.数据聚集的N ...
- Java宝典(四)------Java中也存在内存泄露。
--Java中会存在内存泄露吗? --如果你想当然的以为Java里有了垃圾回收机制就不会存在内存泄露,那你就错了. Java里也会存在内存泄露! 我们慢慢来分析. 所谓内存泄露就是指一个不再被程序使用 ...
- 第六百二十一天 how can I 坚持
好歹都是一些集成的框架,也懒得去深入研究了,微信小程序,今天体验了一个,虽然内心非常相信张小龙,但是还是不太看好,但是感觉确实需要一种方式去简化应用程序的开发,今天把没用的app都删了,太耽误时间了, ...
- 写PPT的方法
这个方法是今天同事的方法,看到他的PPT简洁高效,明了,记下了他的方法: 写文字:写框架,这个框架或者内容可以是word形式的,目的是展示内容 找模板:在搜集到的各种ppt模板中选几个适合自己文字的页 ...
- 文件atime未变问题的研究
1. atime, ctime 以及mtime 这三个名词属于文件/文件夹的属性,存在于inode数据结构之中. 通过系统调用stat可以获取stat结构,其中包括:atime(accesstime) ...
- Android开发记录(转)
一.Android模拟器相关 1. Android模拟器安装 Market 模拟器默认没有安装 Market,看到网上有较为复杂的安装方法,也有1个简单的,试了简单的,在 Android2.2 模拟器 ...
- 微软TTS,Neospeech TTS 简单使用
今天搞了下微软的TTS,逛了好多网页.博客,拼拼凑凑搞了点东西吧. 首先添加类库调用,系统自带的system.speech using System.Speech.Synthesis; 然后就能调用方 ...
- nginx搭建flv、mp4流媒体服务
1.安装pcre-8.33.tar.bz2 #tar -xvf 1.pcre-8.33.tar.bz2 #cd pcre-8.33/ #./configure #make && mak ...