📄 iicdrv.c
字号:
#include "StdAfx.h"
#include "IICDrv.h"
#include "CPU_S3C44B0x.h"
//#define UINT U16
//#define UINT32 U32
//#define BYTE unsigned char
//------------------------------------------------------------------------------
// 初始化IIC总线
void IIC_init(void)
{
*(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|5;
//disable interrupt, IICCLK=MCLK/512, Enable ACK
//40Mhz/512/(0+1) = 117Khz
*(volatile UINT32 *)CN_CPU_IICSTAT=0xd0;
*(volatile UINT32 *)CN_CPU_IICADD=0x10;
}
//=======================================================
// 函数名称:IIC_WaitBus
// 函数功能:等待IIC总线操作结束
// 输入参数:
// 输出参数:
// 返回值:若操作等待超时返回false,正确则返回true
// 说明:
//=======================================================
char IIC_WaitBus(void)
{
UINT i=0;
while(!((*(volatile UINT32*)CN_CPU_IICCON)&0x10)) //等待发送中断
{
i++;
if(i>1000)
return(FALSE);
}
return(TRUE);// added by wy 2005.08.30
}
//=======================================================
// 函数名称:IIC_WaitBus
// 函数功能:等待IIC总线应答信号
// 输入参数:
// 输出参数:
// 返回值:若操作等待超时或得不到应答信号,返回false,正确则返回true
// 说明:先等待操作结束信号,然后判断是否有应答
//=======================================================
char IIC_WaitAck(void)
{
UINT i=0;
while(!((*(volatile UINT32*)CN_CPU_IICCON)&0x10)) //等待发送中断
{
i++;
if(i>1000)
return(FALSE);
}
if((*(volatile UINT32*)CN_CPU_IICSTAT)&0x1)
return(FALSE);
return(TRUE);
}
//=======================================================
// 函数名称:IIC_WaitEnd
// 函数功能:等待写操作结束
// 输入参数:
// 输出参数:
// 返回值:
// 说明:
//=======================================================
char IIC_WaitEnd(void)
{
int i,k;
for (i=0;i<100;i++)
{
*(volatile UINT32*)CN_CPU_IICDS =AT24128256_w; // 地址字节
for(k=0;k<100;k++);
*(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
// for(j=0;j<100;j++);
*(volatile UINT32*)CN_CPU_IICSTAT =0xf0; // 启动发送
k=0;
if(IIC_WaitAck()==TRUE)
return(TRUE);
}
// *(volatile UINT32*)CN_CPU_IICSTAT =0xd0; //产生停止信号
// *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|5;
return(FALSE);
}
//=======================================================
// 函数名称:IIC_Read
// 函数功能:读定值芯片
//
// 输入参数:
// 输出参数:
// 返回值:
// 说明:
//=======================================================
//读24C128
void IIC_Read(UINT start,UINT length,char * buf)
{
int i,iicbusy,k;
//读出地址大于芯片容量则退出
if( (start+length) > CN_IIC_VOLUME ) return;
iicbusy=IIC_WaitEnd();
for(k=0;k<100;k++);
// *(volatile UINT32*)CN_CPU_IICSTAT =0xf0; //启动发送
// *(volatile UINT32*)CN_CPU_IICDS =AT24128256_w;
// for(k=0;k<100;k++);
// *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|5;
// iicSt=*(volatile UINT32*)CN_CPU_IICSTAT;
// while((iicSt&0x1))
// //等待应答位
// iicSt=*(volatile UINT32*)CN_CPU_IICSTAT;
*(volatile UINT32*)CN_CPU_IICDS =(BYTE)(start/256); //地址高字节
for(k=0;k<100;k++);
*(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
if(IIC_WaitAck()==FALSE)
return;
*(volatile UINT32*)CN_CPU_IICDS =(BYTE)(start%256); //地址低字节
for(k=0;k<100;k++);
*(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
// for(k=0;k<100;k++);
if(IIC_WaitAck()==FALSE)
return;
// *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(0<<5)|3;//resumes IIC operation.
*(volatile UINT32*)CN_CPU_IICSTAT =0xb0; //设置为主机接收方式
*(volatile UINT32*)CN_CPU_IICDS =AT24128256_r; //发读命令
*(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
if(IIC_WaitAck()==FALSE)
return;
// buf[0]=*(volatile UINT32*)CN_CPU_IICDS;
//
// iicSt=0;
// while(!(iicSt&0x10)) //等待接收中断
// {
// iicSt=*(volatile UINT32*)CN_CPU_IICCON;
// }
for(i=0;i<length;i++)
{
if(i==length-1)
{
*(volatile UINT32*)CN_CPU_IICCON =0xe3;
*(volatile UINT32*)CN_CPU_IICCON =0x63; //禁止ACK信号
// for(k=0;k<100;k++);
}
// else if(i==length-1)
// {
// buf[i]=*(volatile UINT32*)CN_CPU_IICDS;
// *(volatile UINT32*)CN_CPU_IICSTAT =0x90; //发出停止信号,退出接收状态
// for(k=0;k<100;k++);
// *(volatile UINT32*)CN_CPU_IICCON =0xe3;
// break;
// }
else
*(volatile UINT32*)CN_CPU_IICCON =0xe3;
if(IIC_WaitBus()==FALSE)
return;
buf[i]=*(volatile UINT32*)CN_CPU_IICDS;
}
*(volatile UINT32*)CN_CPU_IICSTAT =0x90; //发出停止信号,退出接收状态
for(k=0;k<100;k++);
*(volatile UINT32*)CN_CPU_IICCON =0xe3;
}
//=======================================================
// 函数名称:IIC_Write
// 函数功能:写定值芯片
// 输入参数:
// 输出参数:
// 返回值:
// 说明:
//=======================================================
void IIC_Write( UINT start, UINT length, char *buf )
{
int i,j,iicbusy,k,addr=start;
//写入地址大于芯片容量则退出
if( addr+length > CN_IIC_VOLUME ) return;
iicbusy = IIC_WaitEnd();
*(volatile UINT32*)CN_CPU_IICDS =(BYTE)(addr/256); //地址高字节
for(k=0;k<100;k++);
*(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
// for(k=0;k<100;k++);
if(IIC_WaitAck()==FALSE)
return;
*(volatile UINT32*)CN_CPU_IICDS =(BYTE)(addr%256); //地址低字节
for(k=0;k<100;k++);
*(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
if(IIC_WaitAck()==FALSE)
return;
j=FALSE;
for (i=0;i<length;i++)
{
if(j)
{
j=FALSE;
iicbusy = IIC_WaitEnd();
// *(volatile UINT32*)CN_CPU_IICSTAT =0xd0; //产生停止信号
// *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|5;
//
// *(volatile UINT32*)CN_CPU_IICDS =AT24128256_w;
//// *(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|5;
// *(volatile UINT32*)CN_CPU_IICSTAT =0xf0; //启动发送
// iicSt=*(volatile UINT32*)CN_CPU_IICSTAT;
// while((iicSt&0x1))
// //等待应答位
// iicSt=*(volatile UINT32*)CN_CPU_IICSTAT;
for(k=0;k<100;k++);
*(volatile UINT32*)CN_CPU_IICDS =(BYTE)((addr+i)/256); //地址高字节
for(k=0;k<100;k++);
*(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
// for(k=0;k<100;k++);
if(IIC_WaitAck()==FALSE)
return;
*(volatile UINT32*)CN_CPU_IICDS =(BYTE)(addr+i); //地址低字节
for(k=0;k<100;k++);
*(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
// for(k=0;k<100;k++);
if(IIC_WaitAck()==FALSE)
return;
}
*(volatile UINT32*)CN_CPU_IICDS =buf[i];
for(k=0;k<100;k++);
*(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
// for(k=0;k<100;k++);
if(IIC_WaitAck()==FALSE)
return;
if((i<length)&&(((addr+i+1) % pagelength)==0))
{
*(volatile UINT32*)CN_CPU_IICSTAT =0xd0; //产生停止信号
*(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
// addr=i+1;
// iicSt=*(volatile UINT32*)CN_CPU_IICSTAT;
// while((iicSt&0x1))
// //等待应答位
// iicSt=*(volatile UINT32*)CN_CPU_IICSTAT;
taskDelay(1);
j=TRUE;
}
}
if(!j)
{
*(volatile UINT32 *)CN_CPU_IICSTAT =0xd0; //产生停止信号
*(volatile UINT32 *)CN_CPU_IICCON=(1<<7)|(1<<6)|(1<<5)|3;
}
taskDelay(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -