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

📄 i2c.c

📁 凌阳SPCE3200多媒体开发板自带源程序。共安排了32个子目录
💻 C
字号:
#include "I2C.h"

#define print1 printf
#define print2 printf

unsigned int i2c_read8(int addr){
	unsigned int a;

	*P_I2C_DATA_ADDR=addr;
	
	*P_I2C_MODE_CTRL=0x41;

	a=*P_I2C_INT_STATUS;
	while(a==0) a=*P_I2C_INT_STATUS;
	*P_I2C_INT_STATUS=1;

	a=*P_I2C_MODE_CTRL&0x08;
	if(a==0) print1("Error! I2C_read8 get NAK\n");

	a=*P_I2C_RX_DATA;
	return a;
}

unsigned int i2c_read16(int addr){
	unsigned int a;

	*P_I2C_DATA_ADDR=addr;
	
	*P_I2C_MODE_CTRL=0x42;

	a=*P_I2C_INT_STATUS;
	while(a==0) a=*P_I2C_INT_STATUS;
	*P_I2C_INT_STATUS=1;

	a=*P_I2C_MODE_CTRL&0x10;
	if(a==0) print1("Error! I2C_read16 get NAK\n");

	a=*P_I2C_RX_DATA;
	return a;
}

unsigned int i2c_readn8(int addr){
	unsigned int a;
	
	//id
	*P_I2C_TX_DATA=0x30;
	*P_I2C_MODE_CTRL=4;
	a=*P_I2C_INT_STATUS;
	while(a==0) a=*P_I2C_INT_STATUS;
	*P_I2C_INT_STATUS=1;
	a=*P_I2C_MODE_CTRL&0x20;
	if(a==0) print1("Error! I2C_readn8 get NAK\n");

	//addr
	*P_I2C_TX_DATA=addr;
	*P_I2C_MODE_CTRL=4;
	a=*P_I2C_INT_STATUS;
	while(a==0) a=*P_I2C_INT_STATUS;
	*P_I2C_INT_STATUS=1;
	a=*P_I2C_MODE_CTRL&0x20;
	if(a==0) print1("Error! I2C_readn8 get NAK\n");

	//stop
	*P_I2C_MODE_CTRL=0x100;

	//id again
	*P_I2C_TX_DATA=0x31;
	*P_I2C_MODE_CTRL=4;
	a=*P_I2C_INT_STATUS;
	while(a==0) a=*P_I2C_INT_STATUS;
	*P_I2C_INT_STATUS=1;
	a=*P_I2C_MODE_CTRL&0x20;
	if(a==0) print1("Error! I2C_readn8 get NAK\n");

	//data
	*P_I2C_MODE_CTRL=0x44;
	a=*P_I2C_INT_STATUS;
	while(a==0) a=*P_I2C_INT_STATUS;
	*P_I2C_INT_STATUS=1;
	a=*P_I2C_MODE_CTRL&0x20;
	if(a==0) print1("Error! I2C_readn8 get NAK\n");

	//stop
	*P_I2C_MODE_CTRL=0x100;
	
	a=*P_I2C_RX_DATA;
	return a;
}

void i2c_write8(int addr, unsigned int value){
	unsigned int a;
	
	*P_I2C_DATA_ADDR=addr;
	*P_I2C_TX_DATA=value;
	
	*P_I2C_MODE_CTRL=1;
	
	a=*P_I2C_INT_STATUS;
	while(a==0) a=*P_I2C_INT_STATUS;
	*P_I2C_INT_STATUS=1;
	
	a=*P_I2C_MODE_CTRL&0x08;
	if(a==0) print2("Error! I2C_write8 get NAK at ");
}

void i2c_write16(int addr, unsigned int value){
	unsigned int a;
	
	*P_I2C_DATA_ADDR=addr;
	*P_I2C_TX_DATA=value;
	
	*P_I2C_MODE_CTRL=2;
	
	a=*P_I2C_INT_STATUS;
	while(a==0) a=*P_I2C_INT_STATUS;
	*P_I2C_INT_STATUS=1;
	
	a=*P_I2C_MODE_CTRL&0x10;
	if(a==0) print1("Error! I2C_write16 get NAK\n");
}

void i2c_writen8(int addr, unsigned int value){
	unsigned int a;
	
	//id
	*P_I2C_TX_DATA=0x30;
	*P_I2C_MODE_CTRL=4;
	a=*P_I2C_INT_STATUS;
	while(a==0) a=*P_I2C_INT_STATUS;
	*P_I2C_INT_STATUS=1;
	a=*P_I2C_MODE_CTRL&0x20;
	if(a==0) print1("Error! I2C_writen8 get NAK\n");

	//addr
	*P_I2C_TX_DATA=addr;
	*P_I2C_MODE_CTRL=4;
	a=*P_I2C_INT_STATUS;
	while(a==0) a=*P_I2C_INT_STATUS;
	*P_I2C_INT_STATUS=1;
	a=*P_I2C_MODE_CTRL&0x20;
	if(a==0) print1("Error! I2C_writen8 get NAK\n");

	//data
	*P_I2C_TX_DATA=value;
	*P_I2C_MODE_CTRL=4;
	a=*P_I2C_INT_STATUS;
	while(a==0) a=*P_I2C_INT_STATUS;
	*P_I2C_INT_STATUS=1;
	a=*P_I2C_MODE_CTRL&0x20;
	if(a==0) print1("Error! I2C_writen8 get NAK\n");
	
	//stop
	*P_I2C_MODE_CTRL=0x100;
}

void i2c_swrite8(int value){
    unsigned int a;

	*P_I2C_TX_DATA=value;
	*P_I2C_MODE_CTRL=4;
	a=*P_I2C_INT_STATUS;
	while(a==0) a=*P_I2C_INT_STATUS;
	*P_I2C_INT_STATUS=1;
	a=*P_I2C_MODE_CTRL&0x20;
	if(a==0) print1("Error! I2C_swrite8 get NAK\n");
}

⌨️ 快捷键说明

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