我这里实现的是非中断模式下的IIC操作
数据手册和代码对照着很容易看懂,尤其是数据手册上IIC那一章的几张程序流程图,一目了然。
下面是代码:
//这里没有用精确延时
void delay1()
{
int i = 0;
int j = 0;
for(i = 0; i < 100; i++)
{
for(j = 0; j < 100; j++);
}
}
/*************************************************************
Function name: IIC_Init
Description: Initialize IIC registers
Parameters: None
Returns: None
**************************************************************/
void IIC_Init()
{
//GPE14:IICSCL GPE15:IICSDA
rGPECON = rGPECON & (~(0xf << 28)) | (0xa << 28);
//GPE14 GPE15 poll up function disabled
rGPEUP = 0xc000;
//rIICCON[7] = 1: enable IIC_bus acknowledge bit
//rIICCON[6] = 0: IICCLK = fPCLK / 16
//rIICCON[5] = 1: Tx/Rx interrupt enable
//rIICCON[3..0]: Tx clock = IICCLK/(IICCON[3:0]+1)
rIICCON = (1 << 7) | (0 << 6) | (1 << 5) | 0x0f;
//rIICSTAT[4] = 1: enable Rx/Tx
rIICSTAT = (1 << 4);
rIICADD = 0x10;
}
/*************************************************************
Function name: Write24C08_nbyte
Description: Write data to 24C08
Parameters: slave_addr: the address of IIC device, often set to "0xa0"
IIC_addr: exact data address
IIC_data: value of data
Returns: None
**************************************************************/
void Write24C08_nbyte(unsigned int slave_addr, unsigned int IIC_addr, unsigned char IIC_data)
{
unsigned int i = 0;
unsigned int j = 0;
rIICDS = slave_addr; //从设备地址
//rIICSTAT[7:6]:11--master Tx mode
//rIICSTAT[5]: 1--start signal
//rIICSTAT[4]: 1--enable Rx/Tx
rIICSTAT = 0xf0; //开始写
while(!(rIICCON & 0x10)); //等待应答信号,该位为1,收到应答
rIICDS = IIC_addr; //向移位寄存器送数据:数据地址
for(i = 0; i < 10; i++);
rIICCON = 0xaf;
while(!(rIICCON & 0x10));
rIICDS = IIC_data; //向移位寄存器送数据
rIICCON = 0xaf; //rIICCON[4] = 0:清空挂起位
while(!(rIICCON & 0x10));
Uart_Printf("Send %d data %d to IIC\n", IIC_addr, IIC_data);
rIICSTAT = 0xd0; //rIICSTAT[5] = 0:STOP signal generation when write,停止信号
rIICCON = 0xaf; //清空挂起位
for(i = 0; i < 10; i++);
}
/*************************************************************
Function name: Read24C08_nbyte
Description: Read data from 24C08
Parameters: slave_addr: the address of IIC device, often set to "0xa0"
IIC_addr: exact data address
databuffer: used to storage data value
Returns: None
**************************************************************/
void Read24C08_nbyte(U32 slave_addr,U32 IIC_addr,U8 *databuffer)
{
unsigned int i = 0;
unsigned int j = 0;
unsigned int add_in = IIC_addr;
U32 temp = 0;
U32 tt = 0;
rIICDS = slave_addr;//0xa0
rIICSTAT = 0xf0; //开启IIC写功能,写IIC地址
while(!(rIICCON & 0x10));
rIICDS = (U8)add_in; //数据具体地址
for(i=0;i<10;i++);
rIICCON = 0xaf; //清空挂起标志位resumes IIC operation.
while(!(rIICCON & 0x10));
rIICDS = slave_addr;
rIICSTAT = 0xb0; //bit[7:6]:10--master Rx mode,master receive mode
rIICCON = 0xaf;
while(!(rIICCON & 0x10));
temp = rIICDS;
rIICCON = 0x2f;
for(i=0;i<10;i++);
while(!(rIICCON & 0x10));
tt = rIICDS;
Uart_Printf("databuffer = 0x%x, %d IIC_addr = %d, temp = %d\n", tt, tt, IIC_addr, temp);
rIICSTAT = 0x90; //停止读
rIICCON = 0xaf;
delay1();
}