📄 iic.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 + -