📄 i2c.c
字号:
/**********************************************************
*File: i2C.c
*Content: Test I2C interface of 24AA256
*data: 03/18/2006 Eric V0.1
* Copyright (c) 2005 Fameg, Inc. All rights reserved
***********************************************************/
#include "DP8051.h"
#include "FS7822.h"
#include "I2C.h"
#define SLAVE_ADDRESS 0xEA
#define bmI2CCK_DIV 0x54
#define bmCLK_PRE 0x40
#define I2C_EN 0x80
#define I2C_MODE 0x40
#define MST_MODE 0x20
#define START 0x02
#define STOP 0x01
void InitCPU()
{
SYS_CFG=bmCPUCLK_SEL|bmPM_AVBLE|bmSYS_SWRST; //select system clock,firmware dispose USB request, reset the device
SYSIO_CFG=bmSPI_EN|bmI2C_EN;
SW_RST=bmSPI_RST|bmI2C_RST;
BPPUCTL=bmSPIPUCTL;
MEMCON=bmMEMCON|bmASYN;
//MEMCON=0x08;
}
void I2c_Init(BOOL isHigh)
{
SW_RST|=bmI2C_RST;
if(isHigh)
I2C_CLK = bmI2CCK_DIV; //400k
else
I2C_CLK = bmCLK_PRE|bmI2CCK_DIV; //100k
I2C_CTL &= 0x3F; //master
I2C_MABT = 0x01; //设定超时时间
}
void I2C_Write(unsigned char *input,unsigned short wordadd,unsigned char Len) //向地址wordadd中写入Len长度的input的内容
{
int i;
I2C_DBUF = SLAVE_ADDRESS; //slave address
I2C_CTL = I2C_EN | MST_MODE | START; //I2C enable, transmit mode and start flag
for(i=0;i<300;i++);
while(!(I2C_STUS & 0x02)); // until Transmit Done
I2C_DBUF = MSB(wordadd); // transmit High address
I2C_STUS = 0x02; // clear Transmit Done interrupt flag
while(!(I2C_STUS & 0x02));
I2C_DBUF = LSB(wordadd); //tramsmit low address
I2C_STUS = 0x02;
while(!(I2C_STUS & 0x02));
for(i = 0;i < Len -1 ;i++) //transmit n -1 data
{
I2C_DBUF = input[i];
I2C_STUS = 0x02;
while(!(I2C_STUS & 0x02));
}
I2C_DBUF = input[i]; // transmit the last data
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x02));
I2C_CTL |= STOP; //configure stop flag
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x04));
I2C_STUS = 0x0F;
}
//------------------------------------------------------------------------------
//output: Data read from EEPROM by I2C interface
//wordadd: Address on which data is read from EEPROM
//Len: Data length
//------------------------------------------------------------------------------
void I2C_Read(unsigned char *output,unsigned short wordadd,unsigned char Len)
{
int i;
I2C_DBUF = SLAVE_ADDRESS; //slave address
I2C_CTL = MST_MODE | START; //I2C enable, transmit mode and start flag
while(!(I2C_STUS & 0x02));
I2C_DBUF = MSB(wordadd); // transmit High address
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x02));
I2C_DBUF = LSB(wordadd); //tramsmit low address
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x02));
I2C_DBUF = SLAVE_ADDRESS | 0x01;
I2C_CTL |= START; //I2C enable, receive mode and start flag
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x02));
for(i = 0;i<Len - 1;i++) //receive n-1 data
{
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x01));
output[i] = I2C_DBUF;
}
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x01));
output[i] = I2C_DBUF; //read last data
I2C_CTL |= 0x01; //configure stop flag
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x04));
I2C_STUS = 0x0F;
}
void I2C_WriteRead(unsigned char *input,unsigned char *output,unsigned short wordadd,unsigned char Len) //测试Restart功能
{
int i;
I2C_DBUF = SLAVE_ADDRESS; //slave address
I2C_CTL = I2C_EN | MST_MODE | START; //I2C enable, transmit mode and start flag
while(!(I2C_STUS & 0x02));
I2C_DBUF = MSB(wordadd); // transmit High address
I2C_STUS = 0x02;
while(!(I2C_STUS & 0x02));
I2C_DBUF = LSB(wordadd); //tramsmit low address
I2C_STUS = 0x02;
while(!(I2C_STUS & 0x02));
for(i = 0;i < Len -1 ;i++) //transmit n -1 data
{
I2C_DBUF = input[i];
I2C_STUS = 0x02;
while(!(I2C_STUS & 0x02));
}
I2C_DBUF = input[i]; // transmit the last data
I2C_STUS = 0x02;
while(!(I2C_STUS & 0x02));
/*
I2C_DBUF = input[i]; // transmit the last data
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x02));
I2C_CTL |= STOP; //configure stop flag
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x04));
I2C_STUS = 0x0F;
*/
// I2C_CTL = 0x02;
I2C_DBUF = SLAVE_ADDRESS; //slave address
I2C_CTL = MST_MODE | START; //I2C enable, transmit mode and start flag
I2C_STUS = 0xFF;
while(!(I2C_STUS & 0x02));
I2C_DBUF = MSB(wordadd); // transmit High address
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x02));
I2C_DBUF = LSB(wordadd); //tramsmit low address
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x02));
I2C_DBUF = SLAVE_ADDRESS | 0x01; //I2C enable, receive mode and start flag
I2C_CTL = I2C_EN | START;
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x02));
for(i = 0;i<Len - 1;i++) //receive n-1 data
{
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x01));
output[i] = I2C_DBUF;
}
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x01));
output[i] = I2C_DBUF; //read last data
I2C_CTL |= 0x01; //configure stop flag
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x04));
I2C_STUS = 0x0F;
}
void start_i2c()
{
I2C_DBUF = SLAVE_ADDRESS;
I2C_CTL = I2C_EN | MST_MODE | START; //I2C enable, transmit mode and start flag
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x02));
I2C_STUS = 0x0F;
I2C_CLK = 0x02;
}
void end_i2c()
{
I2C_CTL |= STOP; //configure stop flag
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x04));
I2C_STUS = 0x0F;
}
void WriteData(BYTE * writedata)
{
start_i2c();
I2C_DBUF = *writedata;
I2C_STUS = 0x02;
while(!(I2C_STUS & 0x02));
end_i2c();
}
void WriteMasterCode()
{
start_i2c();
I2C_DBUF = 0x0A;
I2C_STUS = 0x02;
while(!(I2C_STUS & 0x02));
end_i2c();
}
void ReadData(BYTE * readdata)
{
I2C_DBUF = SLAVE_ADDRESS | 0x01;
I2C_CTL = I2C_EN | START; //I2C enable, receive mode and start flag
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x02));
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x01));
*readdata = I2C_DBUF;
I2C_CTL |= STOP; //configure stop flag
I2C_STUS = 0x0F;
while(!(I2C_STUS & 0x04));
I2C_STUS = 0x0F;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -