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

📄 iic.cpp

📁 vc ad
💻 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 + -