资讯详情

MSP430 IIC 协议程序

坐在电脑前写了一整个下午加一个晚上,终于在430上完成了 IIC 协议,在此附上 代码吧,留个纪念,睡觉去,晚安! #ifndef __IIC_h #define __IIC_h

#include "basic.h" //--------------------------------------- //宏定义 #define IIC_OUT P1OUT #define IIC_D P1DIR #define IIC_SEL P1SEL #define IIC_IN P1IN

#define IIC_SDA_IN IIC_IN&0X01//取SDA读取的值,根据接的高地位不同,与上不同的BIT

#define SDA_OUT IIC_DIR|=BIT0 #define SDA_IN IIC_DIR&=~BIT0

#define SET_SDA IIC_OUT|=BIT0 #define SET_SCL IIC_OUT|=BIT1 #define SET_IIC_EN IIC_OUT|=BIT2 #define CLE_SDA IIC_OUT&=~BIT0 #define CLE_SCL IIC_OUT&=~BIT1 #define CLE_IIC_EN IIC_OUT&=~BIT2

uchar ERROR_BIT=0;//应答错误标志,1错误,0为正确 //--------------------------------------- //IO配置 void IIC_INIT() { IIC_SEL=0X00; IIC_DIR|=(BIT0+BIT1+BIT2+BIT3);//设定三个位输出 } //---------------------------------------- //IIC_ART void IIC_START() { SDA_OUT;//设定SDA输出 SET_SCL; delay(); SET_SDA; delay(); CLE_SDA; delay(); CLE_SCL; delay(); } //---------------------------------------- //IIC_STOP void IIC_STOP() { SDA_OUT;//设定SDA输出 SET_SCL; delay(); CLE_SDA; delay(); SET_SDA; delay(); CLE_SCL; delay(); } //--------------------------------------- //应答信号 void IIC_ACK()//IIC总线应答////////SCL为高电平时,SDA为低电平,(主机对从机) {

SDA_OUT;//设定SDA输出 CLE_SDA; delay(); SET_SCL; delay(); CLE_SCL; delay(); } //---------------------------------------- //无应答信号 void NO_ACK()//(主机对从机) { SDA_OUT;//设定SDA输出 SET_SDA; delay(); SET_SCL; delay(); CLE_SCL; delay(); } //--------------------------------------- uchar ST_ACK()//应答错误检测,1错误,0为正确 { SDA_IN; SET_SCL; delay(); if(IIC_SDA_IN&0x01) ERROR_BIT=1; else ERROR_BIT=0; delay(); CLE_SCL; delay(); return ERROR_BIT; } //-------------------------------------- //IIC写字节 void IIC_WRITE_DATA(uchar data) { uchar i; SDA_OUT;//设定SDA输出 for(i=0;i<8;i++) { SDA_OUT; if(data&0x80) { SET_SDA;//判断发送位,送数据到数据线上 delay(); } else { CLE_SDA; delay(); } data = data<<1; SET_SCL;//置时钟信号为高电平,使数据有效 delay(); CLE_SCL; delay(); } CLE_SCL; delay(); } //---------------------------------------------- //IIC读一个字节 unsigned char IIC_READ_DATA(void) { SDA_IN;//置数据线为输入方向 unsigned char i,q0; unsigned char byte=0; for(i=0;i<8;i++) { SET_SCL; //置时钟为高电平,使数据线数据有效 delay(); byte=byte<<1; SDA_IN; q0=(P1IN & 0X01); if(q0==0X01) byte=(byte|0x01); //将数据存入byte delay(); CLE_SCL; delay(); } return(byte); }

/*uchar IIC_READ_DATA() { uchar temp=0; uchar i;

SDA_IN;//设定SDA输入

for(i=0;i<8;i++) { SDA_IN; SET_SCL; delay(); temp=temp<<1; if(IIC_SDA_IN ==1) { temp++; } delay(); CLE_SCL; delay(); } CLE_SCL; delay(); return temp; }*/ #endif

下面这部分是AT24C02的操作程序

#ifndef ___H #define __EEPROM_H #include "basic.h" #include "IIC.H" //-------------------------------------- //宏定义 #define READ_MODE 0XA1 #define WRITE_MODE 0XA0

//-------------------------------------- //在一个地址写一个数据 uchar AT24C02_W_BYTE(uchar ADD,uchar DATA) { IIC_START();//启动IIC IIC_WRITE_DATA(WRITE_MODE);//写入模式 //delay(); if(TEST_ACK()) return 1; IIC_WRITE_DATA(ADD);//写入数据存储地址 //delay(); if(TEST_ACK()) return 1; IIC_WRITE_DATA(DATA);//写入数据 //delay(); if(TEST_ACK()) return 1; IIC_STOP();//停止IIC return 0; } //----------------------------------------- //读一个地址的数据 uchar AT24C02_R_BYTE(uchar ADD) { uchar temp=0; IIC_START();//启动IIC IIC_WRITE_DATA(WRITE_MODE);//伪写模式 if(TEST_ACK()) return 1; IIC_WRITE_DATA(ADD);//写入读取地址 if(TEST_ACK()) return 1; IIC_START();//重新启动IIC

IIC_WRITE_DATA(READ_MODE);//读取模式 if(TEST_ACK()) return 1; temp=IIC_READ_DATA();//读取数据 NO_ACK(); IIC_STOP(); return temp; } //------------------------------------------ //页写 uchar AT24C02_W_PAGE(uchar *p,uchar ADD,uchar lengh) { uchar i; IIC_START();//启动IIC IIC_WRITE_DATA(WRITE_MODE);//写模式 //delay(); if(TEST_ACK()) return 1; IIC_WRITE_DATA(ADD);//写入起始地址 //delay(); if(TEST_ACK()) return 1; for(i=0;i<lengh;i++)//写入数据 { IIC_WRITE_DATA(*p); //delay(); if(TEST_ACK())//来自EEPROM的应答 return 1; p++; } IIC_STOP();//停止IIC delayms(25);//延时让IIC进行擦除, //延时时间很重要, //如果出现写入数据错误, //则试试延长时间 return 0; } //------------------------------------------ //连续读数据 uchar AT24C02_R_PAGE(uchar *p,uchar ADD,uchar lengh)//*p为要存储数据的数组, //ADD为读取的起始地址, //lengh是要读取的长度,一般小于7 { uchar i; IIC_START();//启动IIC IIC_WRITE_DATA(WRITE_MODE);//伪写模式 if(TEST_ACK()) return 1; IIC_WRITE_DATA(ADD);//写入起始地址 if(TEST_ACK()) return 1; IIC_START();//重新启动IIC

IIC_WRITE_DATA(READ_MODE);//读模式 if(TEST_ACK()) return 1; for(i=0;i<(lengh-1);i++)//读取数据并存储 { *p=IIC_READ_DATA();

IIC_ACK();//来自主机的应答 p++; } *p=IIC_READ_DATA(); NO_ACK(); //停止时主机无应答 delay(); IIC_STOP();//停止IIC delayms(15); return 0; } #endif

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台