⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24c02.c

📁 MSP430读写24C02模拟IIC程序和硬件I2C程序
💻 C
字号:
//*********************************************************************************************
// MSP430读写24C02模拟IIC程序 2006.12.15
// Design by shichenghua
//QQ:57132451
//E-mail: shichenghua20018@163.com
// SDA 接P6.4 ;SCL接 P6.5
// 先读写数据高位后低位
//*********************************************************************************************/
#include <msp430x16x.h>
#include "IIC.h"
#define Write24c02 0xA0 //24C02器件地址+写操作使能
#define Read24c02 0xA1 //24C02器件地址+读操作使能
#define SDA_OUT (P6DIR |=BIT4)
#define SDA_IN  (P6DIR &=~BIT4)
#define SDA_1   (P6OUT |= BIT4)
#define SDA_0   (P6OUT &=~BIT4)
#define SCL_1   (P6OUT |= BIT5)
#define SCL_0   (P6OUT &=~BIT5)
#define SCL_IN  (P6DIR &=~BIT5)
#define SCL_OUT (P6DIR |= BIT5)
unsigned char ErrorBit=0; //读写错误标志 1错误 0 正确
///***************************************************************************
//初始化IIC//端口从输出转换为输入时,默认此时读为1;而转换为输出时,输出值为0
//***************************************************************************/
void InitIIC()
{
SCL_OUT ; //SCL管脚为输出
SDA_IN; //SDA管脚为输入
SCL_0;
Stop();
}
//***************************************
//启动IIC总线 SDA和SCL均为低
//****************************************/
void Start(void) //scl为高电平期间,sda产生一个下降沿
{
SDA_OUT;
SDA_1; //起始条件的数据信号
delay(5);
SCL_1; //起始条件时钟信号
delay(5);
SDA_0; //起始信号
delay(5);
SCL_0; //钳住I2C总线, 准备发送或者接受数据
delay(5);
}
//***************************************
//停止操作,释放IIC总线
//****************************************/
void Stop(void) //scl高电平期间,sda产生一上升沿
{
SDA_OUT;
SCL_0;
delay(5);
SDA_0;
delay(5);//结束条件的数据信号
SCL_1; //结束条件的时钟信号
delay(5);
SDA_1; //结束信号
delay(5);
}
//***************************************
//IIC总线应答/
// ****************************************/
void Ack(void) //IIC总线应答////////SCL为高电平时,SDA为低电平
{
SDA_OUT;
SDA_0;
delay(5);
SCL_1;
delay(5);
SCL_0;
delay(5);
SDA_1;
}
//***************************************
///IIC总线无应答
//****************************************/
void NoAck(void) //IIC总线无应答///SDA维持高电平,SCL产生一个脉冲
{
SDA_OUT;
SDA_1;
delay(5);
SCL_1;
delay(5);
SCL_0;
delay(5);
}
//***************************************
// IIC总线检验应答(SCL高电平期间,读SDA的值)
//返回值:IIC应答位的值 0:应答 1:无应答
//先转换端口为读,这样接收器拉低电平的应答才能确定拉低,
//否则电平被钳位至高平,
//从而造成无应答的情形
// ****************************************/
unsigned char TestAck(void )
{
SDA_IN; //SDA设为输入
delay(5);
SCL_1;
delay(5);
ErrorBit=(P6IN & BIT4)>>4;
delay(5);
SCL_0;
delay(5);
//SDA_OUT;
return(ErrorBit);
}
/***************************************
IIC总线写8位数据()
****************************************/
void Write_I2c(unsigned char data)
{
SDA_OUT;
unsigned char i,temp;
for(i=0;i<8;i++)
{
SDA_OUT;
temp=data&0x80;
if(temp==0x80) SDA_1; //判断发送位,送数据到数据线上
else SDA_0;
delay(10);
SCL_1; //置时钟信号为高电平,使数据有效
delay(5);
SCL_0;
delay(10);
data=data<<1;
}
SDA_IN;
delay(5);
}
/***************************************
IIC总线读8位数据()
****************************************/
unsigned char Read_I2c(void)
{
SDA_IN;//置数据线为输入方向
unsigned char i,q0;
unsigned char byte=0;
for(i=0;i<8;i++)
{
SCL_1; //置时钟为高电平,使数据线数据有效
delay(5);
byte=byte<<1;
SDA_IN;
q0=(P6IN & BIT4);
if(q0==BIT4) byte=(byte|0x01); //将数据存入byte
delay(10);
SCL_0;
delay(10);
}
return(byte);
}
//***************************************
///***************************************************************************
//向24c02中写多个字节
//data:指向要写入数据数组的指针
//StartAddress:24c02中要写入数据的首地址
// bytes:写入的字节数,须小于16
//返回值: 0:执行完毕;1:执行出现错误
//***************************************************************************/
// ****************************************/
unsigned char Write_Date(unsigned char StartAddress,unsigned char *date,unsigned char bytes)
{
unsigned char i=0;
Start();//启动IIC总线
Write_I2c(Write24c02); //写24C02的芯片地址以及确定下面执行写操作
if(TestAck()!=0)//检验应答
return 1;//若应答错误,则退出函数,返回错误
Write_I2c(StartAddress); //写对24C02操作的地址
if(TestAck()!=0)
return 1;
;
for(i=0;i<bytes;i++)
{
Write_I2c(*date); //向24C02中写数据
if(TestAck()!=0)
return 1;
date++; //指向待写数据的指针加1
StartAddress++;//对24C02的操作地址加1
}
Stop();
return 0;
}
/***************************************************************************
从24c02读多个字节
date:指向要保存读出数据的数组的指针
StartAddress:24c02中要读出数据的首地址
bytes:读出的字节数
返回值: 0:执行完毕;1:执行出现错误
***************************************************************************/
unsigned char Read_Date(unsigned char StartAddress,unsigned char *date,unsigned char bytes)
{
unsigned char i;
Start();
Write_I2c(Write24c02);
if(TestAck()!=0)
return 1;
Write_I2c(StartAddress);
if(TestAck()!=0)
return 1;
Start();//再次启动IIC总线
Write_I2c(Read24c02);
if(TestAck()!=0)
return 1;
for(i=0;i<bytes;i++)
{
*date=Read_I2c(); //循环从24C02中读数据,存入data所指的存储器中
Ack();
date++; //指向存储读入数据的存储器指针加1
}
*date=Read_I2c();////读入最后一个字节
NoAck(); //IIC无应答操作
Stop();
return 0;
}
void delay(unsigned char i)
{
unsigned char j;
for(j=0;j<i;j++)
;;
}
//---------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -