📄 i2c.h
字号:
#ifndef _I2C_H
#define _I2C_H
/***************************************************************************************
FileName: I2C.H
CPU: Samsung 2410
System: WinCE 4.2
Description: This class can be used to operator I2C bus to finish reading or writing register.
Author: JUNFENG WANG
Create Date: 2007-5-11
Modify: 2007-6-22 by JUNFENG WANG
*****************************************************************************************/
#include "S3C2410.h"
class I2C{
private:
UCHAR m_ChipAddr; //Slave device address
volatile S3C2410_IOPreg* s2410IOP; //GPIO physical address
volatile S3C2410_IICreg* s2410IIC; //I2C physical address
public:
enum { TIME_OUT = 5000, //wait interupt times
TRY_TIMES = 100, //retry read/write register times
//IIC controller relation:
IICSTAT_MRCV_START_OUTEN = ((2<<6) | (1<<5) | (1<<4)), //master receive mode start condition
IICSTAT_MRCV_STOP_OUTEN = ((2<<6) | (0<<5) | (1<<4)), //master receive mode stop condition
IICSTAT_MSND_START_OUTEN = ((3<<6) | (1<<5) | (1<<4)), //master transmit mode start condition
IICSTAT_MSND_STOP_OUTEN = ((3<<6) | (0<<5) | (1<<4)), //master transmit mode stop condition
IICCON_ACKEN_INTEN_RESUME = ((1<<7) | (1<<6) | (1<<5) | (0<<0)), //ACK enable, interupt enble, start operate
IICCON_ACKDIS_INTEN_RESUME = ((0<<7) | (1<<6) | (1<<5) | (0<<0)), //ACK disable, interupt enabel, start operate
};
I2C(UCHAR addr){
if(!InitAddress())
{
RETAILMSG(1,(_T("InitAddress() failed...IIC can not be used!\n")));
}
else
{
m_ChipAddr=addr;
m_clkdiv=0;
RETAILMSG(1,(_T("chipaddr=0x%x\r\n"),m_ChipAddr));
Initialize();
}
}
~I2C(){
if(s2410IIC)
VirtualFree((PVOID)s2410IIC,0,MEM_RELEASE);
if(s2410IOP)
VirtualFree((PVOID)s2410IOP,0,MEM_RELEASE);
}
private:
UCHAR m_clkdiv;
private:
//basic functions
void Initialize(); // IIC init
void ReInitialize();
void InitializeGPIO(); // GPIO init
BOOL InitAddress(); //map physical addr to virtual addr
BOOL Start(); //I2C start condition
void Stop(BOOL IsSend); // Stop condition
//send one byte
BOOL SendByte(UCHAR data);
//receive one byte
BOOL RcvByte(UCHAR* data,BOOL IsSendAck);
//send multiple bytes...
BOOL SetMultiBytes(
UCHAR Offset,
UCHAR Num,
UCHAR* dat);
//Receive multiple bytes...
BOOL GetMultiBytes(
UCHAR Offset,
UCHAR Num,
UCHAR* dat);
//Set one register...
BOOL SetOneReg(UCHAR Offset,UCHAR *dat);
//Get one register...
BOOL GetOneReg(UCHAR Offset,UCHAR *dat);
public:
//wrapped functions
//send multiple registers...
BOOL SetMultiRegs(UCHAR Offset,UCHAR Num,UCHAR *dat);
//receive multiple registers...
BOOL GetMultiRegs(UCHAR Offset,UCHAR Num,UCHAR *dat);
//Set one register...
BOOL SetReg(UCHAR Offset,UCHAR *dat);
//Get one register...
BOOL GetReg(UCHAR Offset,UCHAR *dat);
public:
UCHAR GetChipAddr() const{
return m_ChipAddr;
}
void SetChipAddr(UCHAR const NewAddr){
m_ChipAddr=NewAddr;
}
public:
void ChangeI2CSpeed(UCHAR const div);
public:
//delay for some time
void Delay(UINT time);
//just for testing...
UINT Test();
};
#endif //I2C_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -