i2ccard.c

来自「I2C卡读写驱动」· C语言 代码 · 共 135 行

C
135
字号
#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 + =
减小字号Ctrl + -
显示快捷键?