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

📄 i2c.h

📁 ssd192X_LPC2210_V2.0 LPC2210的16位数据口控制SSD1926
💻 H
字号:
#ifndef I2C_H
#define I2C_H
#include "UART0.h"
#include "ssd192X.h"

typedef struct
{
	UINT16 deviceID;
	UINT8 bitRate;
} I2C;

#define SSD_I2C_IDLE  		0x00
#define SSD_I2C_WRITE  		0x01
#define SSD_I2C_READ_W_ACK 	0x02
#define SSD_I2C_READ_WO_ACK 0x03

static __inline__ INT32 ssd192X_i2c_wait(void)
{
	 UINT8 reg;
	int count=0;//	printk("I2C wait\n");	 do
	{
	   //reg = SSD_REGRW(REG_I2C_STATUS);		count++;	}
	 while (!(SSD_REGRW(REG_I2C_STATUS) & 0x80));            //Wait for I2C module ready	//printk("I2C wait finish\n");//	printk("total wait=%d loop [R231]=%X status[R%x]=0x%X\n",count++,SSD_REGRB(0x231),REG_I2C_STATUS,SSD_REGRW(REG_I2C_STATUS));	return 0;
}

static __inline__ void ssd192X_i2c_ctl(UINT8 code)
{
	ssd192X_i2c_wait();

	SSD_REGWB(REG_I2C_CTL, code);
}

static __inline__ void ssd192X_i2c_write(UINT8 data)
{
	SSD_REGWB(REG_I2C_DATA_OUT,data);
}

static __inline__ UINT8 ssd192X_i2c_read(void)
{
	SSD_REGWB(REG_I2C_DATA_OUT,0xff); //anything will do

	ssd192X_i2c_wait();

	return SSD_REGRB(REG_I2C_DATA_IN);
}

static __inline__ void ssd192X_i2c_init(I2C *i2c)
{
//	debug("%s: handle %p\n", __FUNCTION__, i2c);
	SSD_REGWB(REG_I2C_INTERRUPT,0x00);
	SSD_REGWB(REG_I2C_BAUD,i2c->bitRate);
	SSD_REGWB(REG_I2C_EN_OUT,0x03);    // Clear I2C bus and enable I2C
	SSD_REGWB(REG_I2C_EN_OUT,0x01);    // Enable I2C
}

static __inline__ UINT8 ssd192X_i2c_readb(I2C *i2c, UINT16 subDeviceId,UINT8 readCmd)
{
	UINT8 data;
	//debug("%s: subID %x, data %x\n", __FUNCTION__, subDeviceId, data);
	ssd192X_i2c_ctl(0x80 | SSD_I2C_WRITE);//issue start 
	ssd192X_i2c_write(i2c->deviceID);
	ssd192X_i2c_wait();	//ssd192X_i2c_ctl(SSD_I2C_WRITE);	ssd192X_i2c_ctl(SSD_I2C_WRITE);
	ssd192X_i2c_write(subDeviceId);
	ssd192X_i2c_wait();	ssd192X_i2c_ctl(0x10);	ssd192X_i2c_write(subDeviceId);	ssd192X_i2c_wait();	SSD_REGWB(REG_I2C_EN_OUT,0x03);	SSD_REGWB(REG_I2C_EN_OUT,0x01);
	ssd192X_i2c_ctl(0x80 | SSD_I2C_WRITE);//issue start 
	ssd192X_i2c_write(i2c->deviceID|0x01);
	ssd192X_i2c_wait();	ssd192X_i2c_ctl(readCmd|0x10);
	data=ssd192X_i2c_read();

	return data;
}

static __inline__ UINT8 ssd192X_i2c_readb_without_ACK(I2C *i2c, UINT16 subDeviceId)
{
	return ssd192X_i2c_readb(i2c, subDeviceId, SSD_I2C_READ_WO_ACK);
}
static __inline__ UINT8 ssd192X_i2c_readb_with_ACK(I2C *i2c, UINT16 subDeviceId)
{
	return ssd192X_i2c_readb(i2c, subDeviceId, SSD_I2C_READ_W_ACK);
}
static __inline__ void ssd192X_i2c_writeb(I2C *i2c, UINT16 subDeviceId, UINT8 data)
{
	UINT8 readbackData1;
	SSD_REGWB(REG_I2C_EN_OUT,0x03);	SSD_REGWB(REG_I2C_EN_OUT,0x01);	//debug("%s: subID %x, data %x\n", __FUNCTION__, subDeviceId, data);
	ssd192X_i2c_ctl(0x80 | SSD_I2C_WRITE);//issue start 
	ssd192X_i2c_write(i2c->deviceID);
	ssd192X_i2c_ctl(SSD_I2C_WRITE);
	ssd192X_i2c_write(subDeviceId);

//	ssd192X_i2c_ctl(SSD_I2C_WRITE);//	ssd192X_i2c_write(data);	ssd192X_i2c_ctl(SSD_I2C_WRITE);//issue stop write cmd	ssd192X_i2c_write(data);

	ssd192X_i2c_ctl(0x10);//issue stop write cmd	ssd192X_i2c_write(data); //dmmy stop	ssd192X_i2c_wait();
// ********* added NOV 28, steve	SSD_REGWB(REG_I2C_EN_OUT,0x03);	SSD_REGWB(REG_I2C_EN_OUT,0x01);	
	readbackData1=ssd192X_i2c_readb_without_ACK(i2c, subDeviceId);	if(readbackData1==data)
	{
		SSD1928ADS_UART0_SendString("Success: 0x");
		SSD1928ADS_UART0_SendHex(readbackData1);
		SSD1928ADS_UART0_SendString("\n\r");
		//printk("dev%x Success: %x\n",subDeviceId,readbackData1);
	}
	else
	{
		SSD1928ADS_UART0_SendString("Fail: 0x");
		SSD1928ADS_UART0_SendHex(readbackData1);
		SSD1928ADS_UART0_SendString("\n\r");
		SSD1928ADS_UART0_SendString("Should be: 0x");
		SSD1928ADS_UART0_SendHex(data);
		SSD1928ADS_UART0_SendString("\n\r");
		//printk("FAIL: dev%x write%x but receive %x\n",subDeviceId,data,readbackData1);
	}
}

static __inline__ void ssd192X_i2c_writew(I2C *i2c, UINT16 subDeviceId, UINT16 data)
{
	//debug("%s: subID %x, data %x\n", __FUNCTION__, subDeviceId, data);
	ssd192X_i2c_ctl(0x80 | SSD_I2C_WRITE);
	ssd192X_i2c_write(i2c->deviceID);
	ssd192X_i2c_ctl(SSD_I2C_WRITE);
	ssd192X_i2c_write(subDeviceId);

	ssd192X_i2c_ctl(SSD_I2C_WRITE);
	ssd192X_i2c_write(data>>8);

	ssd192X_i2c_ctl(0x10 | SSD_I2C_WRITE);
	ssd192X_i2c_write(data & 0xff);

	ssd192X_i2c_wait();
}

static __inline__ void ssd192X_i2c_brust(I2C *i2c, UINT16 subDeviceId, UINT8 *buffer, INT32 size)
{
 	INT32 i;

	//debug("%s: subID %x, data %x size %d\n", __FUNCTION__, subDeviceId, buffer, size);
	ssd192X_i2c_ctl(0x80 | SSD_I2C_WRITE);
	ssd192X_i2c_write(i2c->deviceID);
	ssd192X_i2c_ctl(SSD_I2C_WRITE);
	ssd192X_i2c_write(subDeviceId);

	for(i = 0; i < size - 1; i++)
    {
      ssd192X_i2c_ctl(SSD_I2C_WRITE);
      ssd192X_i2c_write(buffer[i]);
    }

  	ssd192X_i2c_ctl(0x10 | SSD_I2C_WRITE);
  	ssd192X_i2c_write(buffer[i]);

	ssd192X_i2c_wait();
}

#endif

⌨️ 快捷键说明

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