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