DSPIIC.docx
《DSPIIC.docx》由会员分享,可在线阅读,更多相关《DSPIIC.docx(16页珍藏版)》请在冰点文库上搜索。
![DSPIIC.docx](https://file1.bingdoc.com/fileroot1/2023-6/15/f5d3fd29-3d9b-4684-8440-63f1c33e833b/f5d3fd29-3d9b-4684-8440-63f1c33e833b1.gif)
DSPIIC
//GPIOB13iic总线通信操作
#include"DSP281x_Device.h"
#include"System.h"
/********************端口宏定义******************/
#defineSCL_OUTGpioDataRegs.GPDDAT.bit.GPIOD0
#defineSCL_DIRGpioMuxRegs.GPDDIR.bit.GPIOD0
#defineSDA_OUTGpioDataRegs.GPDDAT.bit.GPIOD1
#defineSDA_DIRGpioMuxRegs.GPDDIR.bit.GPIOD1
/********************常量宏定义*******************/
#defineTRUE1
#defineFALSE0
/********************全局变量定义*******************/
unsignedcharw_buffer[8]={23,10,10,20,32,25,28,29};
unsignedcharr_buffer[8]={0};
//主要是定义一些字库
/********************函数声明*******************/
voidInit_24C02(void);
voidSet_SDA_In(void);
voidSet_SDA_Out(void);
voidStart_IIC(void);
voidStop_IIC(void);
voidMaster_ACK(void);
voidMaster_NO_ACK(void);
voidWrite_Byte(unsignedcharcostent);
unsignedcharRead_Byte(void);
unsignedcharEEPROM_Check(void);
voidEEPROM_Read_Byte(unsignedcharAdr,unsignedcharData);
unsignedcharEEPROM_Read_Byte(unsignedcharAdr);
voidEEPROM_Write_Page(unsignedcharAdr,unsignedcharlength,unsignedchar*Data);
voidEEPROM_Read_Page(unsignedcharAdr,unsignedcharlength,unsignedchar*buffer);
unsignedcharEEPROM_Current_Addr_Read(void);
voieEEPROM_Segmential_Read(unsignedcharlength,unsignedchar*buffer);
/****************************************************/
//形式参数:
void
//返回值:
void
//函数描述:
主函数
/****************************************************/
voidmain(void)
{
unsignedchari,temp=0;w_data=17;err=0;r_data;
unsignedchar*pointer;
InitSysCtrl();
Init_24C02();
for(i=0;i<8;i++)
r_buffer[i]=0;
for(i=0;i<5;i++)
{
EEPROM_Write_Byte(temp++,w_data++);
}
temp=0;
w_data=17;
for(i=0;i<8;i++)
{
r_data=EEPROM_Read_Byte(temp++);
if(r_data==w_data)
err=err+1;
w_data++;
}
EEPROM_Write_page(0x28,0,w_buffer);
EEPROM_Read_Page(0x28,0,r_buffer);
while
(1);
}
/****************************************************/
//形式参数:
void
//返回值:
void
//函数描述:
完成IIC的起始条件操作
/****************************************************/
voidStart_IIC(void)
{
unsignedchari;
SCL_OUT=1;
SDA_DAT=1;
for(i=0;i<30;i++);
SDA_DAT=0;
for(i=0;i<30;i++);
SCL_OUT=0;
for(i=0;i<30;i++);
}
/****************************************************/
//形式参数:
void
//返回值:
void
//函数描述:
完成IIC的停止条件操作
/****************************************************/
voidStop_IIC(void)
{
unsignedchari;
SDA_DAT=0;
for(i=0;i<30;i++);
SCL_OUT=1;
for(i=0;i<30;i++);
SDA_DAT=1;
for(i=0;i<30;i++);
}
/****************************************************/
//形式参数:
void
//返回值:
void
//函数描述:
完成IIC的主机应答操作
/****************************************************/
voidMaster_ACK(void)
{
unsignedchari;
SDA_DAT=0;
for(i=0;i<30;i++);
SCL_OUT=1;
for(i=0;i<30;i++);
SCL_OUT=0;
for(i=0;i<30;i++);
SDA_DAT=1;
for(i=0;i<30;i++);
}
/****************************************************/
//形式参数:
void
//返回值:
void
//函数描述:
完成IIC的主机无应答操作
/****************************************************/
voidMaster_NO_ACK(void)
{
unsignedchari;
SDA_DAT=1;
for(i=0;i<30;i++);
SCL_OUT=1;
for(i=0;i<30;i++);
SCL_OUT=0;
for(i=0;i<30;i++);
SDA_DAT=0;
for(i=0;i<30;i++);
}
/****************************************************/
//形式参数:
void
//返回值:
void
//函数描述:
检测从机的应答操作
/****************************************************/
voidEEPROM_Check(void)
{
unsignedchari,Slave_ACK;
SDA_DAT=1;
for(i=0;i<30;i++);
SCL_OUT=1;
for(i=0;i<30;i++);
Set_SDA_In();
for(i=0;i<30;i++);
Slave_ACK=SDA_DAT;//读入SDA数据
SCL_OUT=0;
for(i=0;i<30;i++);
Set_SDA_Out();
if(Slave_ACK==0)
returnTRUE;
else
returnFALSE;
}
/****************************************************/
//形式参数:
void
//返回值:
void
//函数描述:
向IIC总线发送1字节数据
/****************************************************/
voidWrite_Byte(unsignedcharsostest)
{
unsignedchari,j;
for(i=8;i>0;i--)
{
if((costent&0x80)==0x80)
{
SDA_DAT=1;
for(j=0;j<30;j++);
SCL_OUT=1;
for(j=0;j<30;j++);
SCL_OUT=0;
for(j=0;j<30;j++);
}
else
{
SDA_DAT=0;
for(j=0;j<30;j++);
SCL_OUT=1;
for(j=0;j<30;j++);
SCL_OUT=0;
for(j=0;j<30;j++);
}
costest<<1;
}
}
/****************************************************/
//形式参数:
void
//返回值:
void
//函数描述:
向IIC总线读取1字节数据
/****************************************************/
unsignedcharRead_Byte(void)
{
unsignedchari,j,temp=0;
for(j=0;i<8;i++)
{
Set_SDA_Out();
SDA_DAT_Out()
SCL_OUT=1;
for(j=0;j<30;j++);
Set_SDA_In();
if(SDA_DAT==1)
temp|=(0x01<<(7
SCL_OUT=0;
for(j=0;j<30;j++);
}
Set_SDA_Out();
return(temp);
}
/****************************************************/
//形式参数:
void
//返回值:
void
//函数描述:
向指定地址写入一字节数据
/****************************************************/
voidEEPROM_Write_Byte(unsignedcharAdr,unsignedcharData)
{
unsignedchartemp=0;
unsignedinti;
Start_IIC();
Write_byte(0xA0)//发送写命令
temp=EEPROM_Check()//等待ACK
if(temp==FALSE)
{
return;
}
Write_Byte(Adr);//发送指针寄存器
temp=EEPROM_Check()//等待ACK
if(temp==FALSE)
{
return;
}
Write_Byte(Data);//发送数据
temp=EEPROM_Check()//等待ACK
if(temp==FALSE)
{
return;
}
Stop_IIC();
for(i=0;i<10000;i++);//等待写入完成
}
/****************************************************/
//形式参数:
void
//返回值:
void
//函数描述:
向指定地址读出一个字节数据
/****************************************************/
unsignedcharEEPROM_Read_Byte(unsignedcharAdr)
{
unsignedchartemp=0,r_data;
Start_IIC();
Write_byte(0xA0)//发送写命令24c02地址为A0
temp=EEPROM_Check()//等待ACK
if(temp==FALSE)
{
returnFALSE;
}
Write_Byte(Adr);//发送指针寄存器
temp=EEPROM_Check()//等待ACK
if(temp==FALSE)
{
returnFALSE;
}
Start_IIC();
Write_Byte(0XA1);//发送读命令最后一位是1
temp=EEPROM_Check()//等待ACK
if(temp==FALSE)
{
returnFALSE;
}
r_data=Rdad_Byte();
Master_NO_ACK();
Stop_IIC();
returnr_data;
}
/****************************************************/
//形式参数:
Adr-地址length--长度,*Data--数据指针
//返回值:
void
//函数描述:
向指定地址写入一个字节数据
/****************************************************/
voidEEPROM_Write_Page(unsignedcharAdr,unsignedcharlength,unsignedchar*Data)
{
unsignedchartemp=0;
unsignedinti,j;
Start_IIC();
Write_byte(0xA0)//发送写命令24c02地址为A0
temp=EEPROM_Check()//等待ACK
if(temp==FALSE)
{
return;
}
Write_Byte(Adr);//发送指针寄存器
temp=EEPROM_Check()//等待ACK
if(temp==FALSE)
{
return;
}
for(i=0;i{
Write_Byte(*Data);//发送数据
Data++;
temp=EEPROM_Check()//等待ACK
if(temp==FALSE)
{
return;
}
}
Stop_IIC();
for(j=0;j<10000;j++);//等待数据写入
}
/****************************************************/
//形式参数:
Adr-地址length--长度,*Data--数据指针
//返回值:
void
//函数描述:
向指定地址读出length个字节数据
/****************************************************/
unsignedcharEEPROM_Read_Page(unsignedcharAdr,unsignedcharlength,unsignedchar*buffer)
{
unsignedchartemp=0,i;
Start_IIC();
Write_Byte(0xA0);
temp=EEPROM_Check()//等待ACK
if(temp==FALSE)
{
return;
}
Write_Byte(Adr);
temp=EEPROM_Check()//等待ACK
if(temp==FALSE)
{
return;
}
Start_IIC();
Write_Byte(0xA1);
temp=EEPROM_Check()//等待ACK
if(temp==FALSE)
{
return;
}
for(i=0;i{
*buffer=Read_Byte();
buffer++;
Master_ACK();
}
*buffer=Read_Byte();
Master_NO_ACK();
Stop_IIC();
}
/****************************************************/
//形式参数:
void
//返回值:
当前地址数据
//函数描述:
从EEPROM当前地址读出一个字节的数据
/****************************************************/
unsignedcharEEPROM_Current_Addr_Read(void)
{
unsignedchartemp;
Start_IIC();
Write_Byte(0xA1);
temp=EEPROM_Check();
if(temp==FALSE)
{
returnFALSE;
}
temp=Read_Byte();
Master_NO_ACK();
Stop_IIC();
returntemp;
}
/****************************************************/
//形式参数:
length--长度buffer-数据存储区
//返回值:
void
//函数描述:
从EEPROM当前地址连续读出length个字节数据
/****************************************************/
voidEEPROM_Segmential_Read(unsignedlength,unsignedchar*buffer)
{
unsignedchartemp,i;
Start_IIC();
Write_Byte(0xA1);
temp=EEPROM_Check();
if(temp==FALSE)
{
returnFALSE;
}
for(i=0;i{
*buffer=Read_Byte();
buffer++;
Master_ACK();
}
*buffer=Read_Byte();
Master_NO_ACK();
Stop_IIC();
}