📄 i2ccard.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 + -