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

📄 i2ccard.c

📁 I2C卡读写驱动
💻 C
字号:
#include"I2cCard.h"


void Init_Card()
{       
  P2DIR &=~BIT1;
  P2IE  |= BIT1;
  P2IES &=~BIT1;      //上升沿触发中断
  CARDSDA_1;
  CARDSCL_1;
  CARDSCL_OUT; //CLK为输出状态
  CARDSDA_OUT;
}

//----------------------------------------------------------------------------------
//I2C 软件模拟程序
//----------------------------------------------------------------------------------
void Card_start(void)
{
	CARDSDA_OUT;
	CARDSDA_1;                     //将数据置1
	NOP2;
	CARDSCL_1;                     //时钟置1
	NOP2
	CARDSDA_0;                     //启动
	NOP2;
	CARDSCL_0;                     //start 
	NOP2;
}

void Card_stop(void)
{ 
	CARDSDA_OUT;
	CARDSDA_0;
	NOP2;
	CARDSCL_1;
	NOP2;
	CARDSDA_1;
	NOP2;
}
void Card_bytewrite(uchar writedata)
{
	uchar i;

	for(i=0; i<8; i++)
	{
		if (writedata & BIT7)
			CARDSDA_1;
		else
			CARDSDA_0;
		writedata <<= 1;
		CARDSCL_1;
		NOP4;
		CARDSCL_0;
		NOP2;
	}
}

uchar Card_byteread(void)
{
	uchar i,tempdata=0;

	CARDSDA_IN;                                      //置为输入

	for (i=0; i<8; i++)
	{
		CARDSCL_1;
		_NOP();
		tempdata <<= 1;
		if (CARDSDA_VAL)
			tempdata |= 1;
		CARDSCL_0;
		NOP4;
	}
	return tempdata;
}

void CardAcknowledge(void)
{

	CARDSCL_0;
	NOP2;
	CARDSDA_OUT;  
	CARDSDA_0;  
	CARDSCL_1;  
	NOP2;  
	CARDSCL_0;
}

void CardReceiveAck(void)
{
	uchar i = 0;
	CARDSCL_1; 
	CARDSDA_IN;                                         //送回应脉冲
	NOP2;
	while ((CARDSDA_VAL) && (i < 20))i++;
	CARDSDA_OUT;
	CARDSCL_0;
	NOP2;
}
uchar Card_Read(uint i2caddr)
{
	uchar tempdata;

	Card_start();
	Card_bytewrite(CARDDEVADDR_WR);                      //写地址
	CardReceiveAck();
	Card_bytewrite(i2caddr>>8);                      //写高地址
	CardReceiveAck();
	Card_bytewrite(i2caddr);                         //写低地址
	CardReceiveAck();
	Card_start();
	Card_bytewrite(CARDDEVADDR_RD);                      //读地址
	CardReceiveAck();
	tempdata = Card_byteread(); 
	Card_stop();
	Delay(20);
	return tempdata;
}
void Card_Write(uint i2caddr,uchar i2cdata)
{ 
	Card_start();
	Card_bytewrite(CARDDEVADDR_WR);                      //写地址
	CardReceiveAck();
	Card_bytewrite(i2caddr>>8);                      //写高地址
	CardReceiveAck();
	Card_bytewrite(i2caddr);                         //写低地址
	CardReceiveAck();
	Card_bytewrite(i2cdata);
	CardReceiveAck();
	Card_stop();
	Delay(4800);
}

⌨️ 快捷键说明

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