📄 iic.cpp
字号:
#include "stdafx.h"
#include "card.h"
//#include "utility.h"
#include "boardreg.h"
#include "iic.h"
#define MCSETBIT(a) (((long)(a))<<16)|(a)
#define MCCLRBIT(a) ((long)(a))
BOOL CCard::GetEepromHeader(PUCHAR pBuf)
{
for(int i=0; i<11; i++){
*pBuf++=IICRead(IIC_SUB_EEP, i);
if(bIICError)
return FALSE;
}
return TRUE;
}
BOOL CCard::GetEepromContent(PUCHAR pBuf)
{
for(int i=0; i<256; i++){
*pBuf++=IICRead(IIC_SUB_EEP, i);
if(bIICError)
return FALSE;
}
return TRUE;
}
BOOL CCard::SetEepromHeader(PUCHAR pBuf)
{
IICWriteEepromBlock(0, 11, pBuf);
/* for(int i=0; i<11; i++){
IICWrite(IIC_SUB_EEP, i, *pBuf++);
if(bIICError)
return FALSE;
Sleep(20);
}*/
return TRUE;
}
void CCard::OpenIIC(void)
{
WriteReg(MC1,MCSETBIT(EI2C));
WriteReg(I2C_STATUS, 0x600);//0x00); //0x400
UploadI2c();
}
void CCard::CloseIIC(void)
{
WriteReg(MC1,MCCLRBIT(EI2C));
}
void CCard::UploadI2c()
{
WriteReg(MC2,MCSETBIT(UPLD_IIC));
}
#define IIC_ATT_START 3
#define IIC_ATT_CONT 2
#define IIC_ATT_STOP 1
#define IIC_ATT_NOP 0
#define BUSY 1
#define MAKE_IIC_TRF(by2,by1,by0,at2,at1,at0) \
(((long)by2)<<24)|(((long)by1)<<16)|(((long)by0)<<8)|((at2)<<6)|((at1)<<4)|((at0)<<2)
int CCard::IICWrite(unsigned char uAddr, unsigned char uSubAddr, unsigned char nByte)
{
unsigned char BYTE2,BYTE1,BYTE0;
unsigned char ATTR2,ATTR1,ATTR0;
bIICError=FALSE;
ULONG dw;
BYTE2=uAddr;
ATTR2=IIC_ATT_START;
BYTE1=uSubAddr;
ATTR1=IIC_ATT_CONT;
BYTE0=nByte;
ATTR0=IIC_ATT_STOP;
dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
WriteReg(I2C_TRANSFER, dw);
UploadI2c();
return WaitIICAck();
}
unsigned char CCard::IICRead(unsigned char uAddr, unsigned char uSubAddr)
{
unsigned char BYTE2,BYTE1,BYTE0;
unsigned char ATTR2,ATTR1,ATTR0;
ULONG dw;
int i=0;
bIICError=FALSE;
BYTE2=uAddr;
ATTR2=IIC_ATT_START;
BYTE1=uSubAddr;
ATTR1=IIC_ATT_CONT;
BYTE0=uAddr|0x01;
ATTR0=IIC_ATT_START;
dw=ReadReg(I2C_STATUS);
dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
WriteReg(I2C_TRANSFER, dw);
UploadI2c();
if(!WaitIICAck())
return 0xff;
ATTR2=IIC_ATT_STOP;
ATTR1=IIC_ATT_NOP;
ATTR0=IIC_ATT_NOP;
WriteReg(I2C_TRANSFER, (ATTR2<<6)|(ATTR1<<4)|(ATTR0<<2));
UploadI2c();
dw=WaitIICAck();
if(!dw)
return 0xff;
else
return (unsigned char)((dw&0xff000000)>>24);
}
int CCard::WaitIICAck()
{
int i;
ULONG dw;
i=0;
while(i<50){
Sleep(1);
dw= ReadReg(I2C_TRANSFER);
if(dw&0x02){
bIICError=1;
IICAbort();
return 0;
}
if(!(dw&BUSY))
break;
i++;
}
if(i==50){
bIICError=1;
IICAbort();
return 0;
}
return dw;
}
int CCard::IICWriteEepromBlock(int nOffset, int nWrite, PUCHAR pBuf)
{
if(nWrite>16)
return 0;
BYTE buf[20];
buf[0]=nOffset;
memcpy(buf+1, pBuf, nWrite);
return IICWriteBytes(IIC_SUB_EEP, nWrite+1, buf);
}
/*int CCard::IICWriteEepromBlock(int nOffset, int nWrite, PUCHAR pBuf)
{
unsigned char BYTE2,BYTE1,BYTE0;
unsigned char ATTR2,ATTR1,ATTR0;
ULONG dw;
BYTE2=IIC_SUB_EEP;
ATTR2=IIC_ATT_START;
BYTE1=nOffset;
ATTR1=IIC_ATT_CONT;
BYTE0=*pBuf++;
if(nWrite==1)
ATTR0=IIC_ATT_STOP;
else
ATTR0=IIC_ATT_CONT;
dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
WriteReg(I2C_TRANSFER, dw);
UploadI2c();
if(!WaitIICAck())
return 0;
nWrite--;
while(nWrite>=3){
BYTE2=*pBuf++;
ATTR2=IIC_ATT_CONT;
BYTE1=*pBuf++;
ATTR1=IIC_ATT_CONT;
BYTE0=*pBuf++;
if(nWrite==3)
ATTR0=IIC_ATT_STOP;
else
ATTR0=IIC_ATT_CONT;
dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
WriteReg(I2C_TRANSFER, dw);
UploadI2c();
if(!WaitIICAck())
return 0;
nWrite-=3;
}
if(nWrite==0)
return 1;
if(nWrite==2){
BYTE2=*pBuf++;
ATTR2=IIC_ATT_CONT;
BYTE1=*pBuf++;
ATTR1=IIC_ATT_STOP;
}
else{
BYTE2=*pBuf++;
ATTR2=IIC_ATT_STOP;
BYTE1=0;
ATTR1=IIC_ATT_NOP;
}
BYTE0=0;
ATTR0=IIC_ATT_NOP;
dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
WriteReg(I2C_TRANSFER, dw);
UploadI2c();
if(!WaitIICAck())
return 0;
return 1;
}
*/
int CCard::IICWriteBytes(BYTE bySub, int nWrite, PUCHAR pBuf)
{
unsigned char BYTE2,BYTE1,BYTE0;
unsigned char ATTR2,ATTR1,ATTR0;
ULONG dw;
BYTE2=bySub;
ATTR2=IIC_ATT_START;
BYTE1=*pBuf++;
ATTR1=IIC_ATT_CONT;
BYTE0=*pBuf++;
if(nWrite<=2)
ATTR0=IIC_ATT_STOP;
else
ATTR0=IIC_ATT_CONT;
dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
WriteReg(I2C_TRANSFER, dw);
UploadI2c();
if(!WaitIICAck())
return 0;
nWrite-=2;
while(nWrite>=3){
BYTE2=*pBuf++;
ATTR2=IIC_ATT_CONT;
BYTE1=*pBuf++;
ATTR1=IIC_ATT_CONT;
BYTE0=*pBuf++;
if(nWrite==3)
ATTR0=IIC_ATT_STOP;
else
ATTR0=IIC_ATT_CONT;
dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
WriteReg(I2C_TRANSFER, dw);
UploadI2c();
if(!WaitIICAck())
return 0;
nWrite-=3;
}
if(nWrite==0)
return 1;
if(nWrite==2){
BYTE2=*pBuf++;
ATTR2=IIC_ATT_CONT;
BYTE1=*pBuf++;
ATTR1=IIC_ATT_STOP;
}
else{
BYTE2=*pBuf++;
ATTR2=IIC_ATT_STOP;
BYTE1=0;
ATTR1=IIC_ATT_NOP;
}
BYTE0=0;
ATTR0=IIC_ATT_NOP;
dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
WriteReg(I2C_TRANSFER, dw);
UploadI2c();
if(!WaitIICAck())
return 0;
return 1;
}
void CCard::IICAbort()
{
unsigned long dw;
dw= ReadReg(I2C_STATUS);
WriteReg(I2C_STATUS, 0x80);
UploadI2c();
dw= ReadReg(I2C_STATUS);
WriteReg(I2C_STATUS, 0x0);
UploadI2c();
dw= ReadReg(I2C_STATUS);
WriteReg(I2C_STATUS, 0x0);
UploadI2c();
dw= ReadReg(I2C_STATUS);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -