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

📄 iic.c

📁 基于S3C44b0的键盘LED接口设计
💻 C
字号:
/**************************************************************************
NAME:IIC.C
copyright:wzz at Qingdao University  2008.12.27
**************************************************************************/
#include "..\inc\WOPTIONS.h"
//请在使用IIC之前确认port初始化PORTF已经定义了IIC管脚功能,已经外部中断1的触发方式。
//1.1初始化函数
//------------------------------------------------------------------
void init44B0IIC(U8 mode,U16 clock,U8 sl_add )
{

rIICCON|=(IICACK_EN | IICINT_EN);
//enable ACK,enable Interrupt
//--------------
//set clock
rIICCON&=0xf0;
switch(clock)
  {case 400:  rIICCON&=~IICCLK; rIICCON|=0x0a;break;
              //IICLK=MCLK/16,IIC_BUS=384KHz
   case 100:  
   default :  rIICCON|=IICCLK; rIICCON|=0x01;break; 
              //IICLK=MCLK/512,IIC_BUS=66KHz
   } 

rIICSTAT&=~IICSOUT_EN;

rIICADD=sl_add<<1;

rIICSTAT|=IICSOUT_EN;

rIICSTAT&=0x3f;
rIICSTAT|=(mode<<6);
}
//1.2重新设置是否发送确认帧
//------------------------------------------------------------------
void IIC_ReSetACK(U8 ack_yes) //1=ACK enable 0=ACK disable
{if(ack_yes)
   rIICCON|=IICACK_EN;
 else
   rIICCON&=~IICACK_EN;  
}
//1.3重新设置发送接接收模式
//------------------------------------------------------------------
void IIC_ReSetMode(U8 mode)
{
rIICSTAT&=0x3f;
rIICSTAT|=(mode<<6);
}
//1.4开始IIC传送
//------------------------------------------------------------------
void IIC_Start(U8 slaveaddr)
{
rIICDS=slaveaddr;
rIICSTAT|=IICSTART;
while(!(rIICCON&IICINT_PEND));

}
//1.5重新开始IIC传送
//------------------------------------------------------------------
void IIC_ReStart(U8 slaveaddr)
{
rIICDS=slaveaddr;
rIICSTAT|=IICSTART;
rIICCON&=~IICINT_PEND;
while(!(rIICCON&IICINT_PEND));

}
//1.6发送n位数据
//------------------------------------------------------------------
void IIC_SendData(U8 *data, U8 num)
{U8 i;
 for(i=0;i<num;i++)
   {rIICDS=data[i]; //data
    rIICCON&=~IICINT_PEND;
    while(!(rIICCON&IICINT_PEND));
   }
}
//1.7发送一个字节数据
//------------------------------------------------------------------
void IIC_SendByte(U8 byte)
{
    rIICDS=byte; //data
    rIICCON&=~IICINT_PEND;
    while(!(rIICCON&IICINT_PEND));
}
//1.8接收一个字节数据
//------------------------------------------------------------------
void IIC_ReadByte(U8 *byte)
{
    rIICCON&=~IICINT_PEND;
    while(!(rIICCON&IICINT_PEND));
    *byte=rIICDS;
}
//1.9接收n位数据
//------------------------------------------------------------------
void IIC_ReadData(U8 *data, U8 num)
{U8 i;
 for(i=0;i<num;i++)
   {
    rIICCON&=~IICINT_PEND;
    while(!(rIICCON&IICINT_PEND));
    data[i]=rIICDS; //data
   }
}
//1.10IIC停止工作
//------------------------------------------------------------------

void IIC_Stop(void)
{rIICSTAT&=~IICSTART;
 rIICCON&=~IICINT_PEND;
}
//******************************************************************************************//
//2.1I2C上层发送函数
//------------------------------------------------------------------
void I2C_Puts(U8 deviceaddr,U8 dataaddr,U8 *data,U8 num)
{//the number of data Not more than 8 Bytes,and must be in the same page!
int i=20000;
init44B0IIC(IICMODE_MATX,100,0xff);
//AT24C02-2.7 100K under 3.3V 
IIC_Start(deviceaddr&0xfe);
IIC_SendByte(dataaddr);
IIC_SendData(data,num);//one page for AT24c02 is of 8 Bytes
IIC_Stop();
while(i--);//wait 24c02 write cycle

}
//2.2I2C上层接收数据函数
//------------------------------------------------------------------
void I2C_Gets(U8 deviceaddr,U8 dataaddr,U8 *data,U8 num)
{
init44B0IIC(IICMODE_MATX,100,0xff);
//AT24C02-2.7 100K under 3.3V 
IIC_Start(deviceaddr&0xfe);
IIC_SendByte(dataaddr);

IIC_ReSetMode(IICMODE_MARX);
IIC_ReStart(deviceaddr|0x01);
IIC_ReadData(data,num-1);
IIC_ReSetACK(0);
IIC_ReadData(data+num-1,1);
IIC_Stop();
}
//******************************************************************************************//
//******************************************************************************************//
//codes below are left for further use
/*
the device address of AT24C02 is 1010xxxWb,
xxx is chip address,W=0 to write W=0 to read .
-----------------------------------------------------
but in these functions below, deviceaddr is 1010xxx0; 

*/
void WriteAt24cByte(U8 deviceaddr,U8 dataaddr,U8 byte)
//可以修改成发送一个字节函数,没有删去,以后可能会用到
{
int i=20000;
init44B0IIC(IICMODE_MATX,100,0xff);
//AT24C02-2.7 100K under 3.3V 
IIC_Start(deviceaddr&0xfe);
IIC_SendByte(dataaddr);
IIC_SendByte(byte);
IIC_Stop();
while(i--);//wait 24c02 write cycle
}
//left for further use
void WriteAt24cPage(U8 deviceaddr,U8 dataaddr,U8 *data)
{
int i=20000;
init44B0IIC(IICMODE_MATX,100,0xff);
//AT24C02-2.7 100K under 3.3V 
IIC_Start(deviceaddr&0xfe);
IIC_SendByte(dataaddr);
IIC_SendData(data,8);//one page for AT24c02 is of 8 Bytes
IIC_Stop();
while(i--);//wait 24c02 write cycle

}
//left for further use
void ReadAt24cCur(U8 deviceaddr,U8 *data,U8 num)
{
init44B0IIC(IICMODE_MARX,100,0xff);
//AT24C02-2.7 100K under 3.3V 
IIC_Start(deviceaddr|0x01);
IIC_ReadData(data,num-1);
IIC_ReSetACK(0);
IIC_ReadData(data+num-1,1);
IIC_Stop();
}
//******************************************************************************************//

⌨️ 快捷键说明

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