#include "main.h"
#include "spi.h"
#include "fm175xx.h"
/*************************************************************/
//函数名: Read_Reg
//功能: 读寄存器操作
//输入参数: reg_add,寄存器地址
//返回值: 寄存器数值
/*************************************************************/
unsigned char Read_Reg(unsigned char reg_add)
{
unsigned char reg_value;
reg_value=SPIRead(reg_add);
return reg_value;
}
/*************************************************************/
//函数名: Read_Reg All
//功能: 读64个寄存器操作
//输入参数: 无
//输出参数 *reg_value,寄存器数值指针,长度为64字节
//返回值: OK
/*************************************************************/
unsigned char Read_Reg_All(unsigned char *reg_value)
{
unsigned char i;
for (i=0;i<64;i++)
*(reg_value+i)=Read_Reg(i);
return OK;
}
/*************************************************************/
//函数名: Write_Reg
//功能: 写寄存器操作 */
//输入参数: reg_add,寄存器地址;reg_value,寄存器数值
//返回值:
/*************************************************************/
unsigned char Write_Reg(unsigned char reg_add, unsigned char reg_value)
{
SPIWrite(reg_add,reg_value);
return OK;
}
/*************************************************************/
//函数名: Read_FIFO
//功能: 读取FIFO */
//输入参数: length,读取FIFO数据长度
//输出参数: *fifo_data,FIFO数据存放指针
//返回值: */
/*************************************************************/
void Read_FIFO(unsigned char length,unsigned char *fifo_data)
{
SPIRead_Sequence(length,FIFODataReg,fifo_data);
//while(length--) //效率较慢
{
// *(fifo_data++)=Read_Reg(FIFODataReg);
}
return;
}
/*************************************************************/
//函数名: Write_FIFO
//功能: 写入FIFO */
//输入参数: length,读取数据长度;
// *fifo_data,数据存放指针
//输出参数:
//返回值: */
/*************************************************************/
void Write_FIFO(unsigned char length,unsigned char *fifo_data)
{
SPIWrite_Sequence(length,FIFODataReg,fifo_data);
//while(length--)
{
// Write_Reg(FIFODataReg,*(fifo_data++));
}
return;
}
/*************************************************************/
//函数名: Clear_FIFO
//功能: 清空FIFO */
//输入参数: 无
//返回值: OK
// ERROR
/*************************************************************/
unsigned char Clear_FIFO(void)
{
Set_BitMask(FIFOLevelReg,0x80);//清除FIFO缓冲 bit7=1
if (Read_Reg(FIFOLevelReg)==0)
return OK;
else
return ERROR;
}
/*************************************************************/
//函数名: Set_BitMask
//功能: 置位寄存器操作
//输入参数: reg_add,寄存器地址;mask,寄存器置位
//返回值:
/*************************************************************/
unsigned char Set_BitMask(unsigned char reg_add,unsigned char mask)
{
unsigned char result;
result = Write_Reg(reg_add,Read_Reg(reg_add) | mask); // set bit mask
return result;
}
/*************************************************************/
//函数名: Clear_BitMask
//功能: 清除位寄存器操作
//输入参数: reg_add,寄存器地址;mask,寄存器清除位
//返回值:
/*************************************************************/
unsigned char Clear_BitMask(unsigned char reg_add,unsigned char mask)
{
unsigned char result;
result = Write_Reg(reg_add,Read_Reg(reg_add) & ~mask); // clear bit mask
return result;
}
/*************************************************************/
//函数名: Set_RF
//功能: 设置射频输出
//输入参数: mode,射频输出模式
// 0,关闭输出
// 1,仅打开TX1输出
// 2,仅打开TX2输出
// 3,TX1,TX2打开输出,TX2为反向输出
//返回值: OK ERROR
/*************************************************************/
unsigned char Set_Rf(unsigned char mode)
{
unsigned char result;
if ((Read_Reg(TxControlReg)&0x03)==mode)
return OK;
if (mode==0)
{
result=Clear_BitMask(TxControlReg,0x03); //关闭TX1,TX2输出
}
if (mode==1)
{
result=Clear_BitMask(TxControlReg,0x01); //仅打开TX1输出
}
if (mode==2)
{
result=Clear_BitMask(TxControlReg,0x02); //仅打开TX2输出
}
if (mode==3)
{
result=Set_BitMask(TxControlReg,0x03); //打开TX1,TX2输出
}
Delay_ms(10);//打开TX输出后需要延时等待天线载波信号稳定
return result;
}
/*************************************************************/
//函数名: Pcd_Comm
//功能: 读卡器通信
//输入参数: Command,通信操作命令;
// pInData,发送数据数组;
// InLenByte,发送数据数组字节长度;
// pOutData,接收数据数组;
// pOutLenBit,接收数据的位长度
//返回值: OK ERROR
/*************************************************************/
unsigned char Pcd_Comm( unsigned char Command,
unsigned char *pInData,
unsigned char InLenByte,
unsigned char *pOutData,
unsigned int *pOutLenBit)
{
unsigned char result;
unsigned char rx_temp=0;//临时数据字节长度
unsigned char rx_len=0;//接收数据字节长度
unsigned char lastBits=0;//接收数据位长度
unsigned char irq;
Clear_FIFO();
Write_Reg(CommandReg,Idle);
Write_Reg(WaterLevelReg,0x20);//设置FIFOLevel=32字节
Write_Reg(ComIrqReg,0x7F);//清除IRQ标志
if(Command==MFAuthent)
{
Write_FIFO(InLenByte,pInData);//填入认证密钥
Set_BitMask(BitFramingReg,0x80);//启动发送
}
Set_BitMask(TModeReg,0x80);//自动启动定时器,(发射结束即自动开始计数)
Write_Reg(CommandReg,Command);
while(1)//循环判断中断标识
{
irq = Read_Reg(ComIrqReg);//查询中断标志
if(irq&0x01) //TimerIRq 定时器时间用尽
{
result=ERROR;
break;
}
if(Command==MFAuthent)
{
if(irq&0x10) //IdelIRq 指令执行完成或CommandReg寄存器为Idle空闲
{
result=OK;
break;
}
}
if(Command==Transmit)
{
if((irq&0x04)&&(InLenByte>0)) //LoAlertIrq+发送字节数大于0
{
if (InLenByte<32)
{
Write_FIFO(InLenByte,pInData);
InLenByte=0;
}
else
{
Write_FIFO(32,pInData);
InLenByte=InLenByte-32;
pInData=pInData+32;
}
Set_BitMask(BitFramingReg,0x80); //启动发送
Write_Reg(ComIrqReg,0x04); //清除LoAlertIrq
}
if((irq&0x40)&&(InLenByte==0)) //TxIRq
{
result=OK;
break;
}
}
if(Command==Transceive)
{
if((irq&0x04)&&(InLenByte>0)) //LoAlertIrq + 发送字节数大于0 Status!Reg中bit0 LoAlert=FIFOLength<=WaterLevel(0x20)置1,ComIRqReg中bit2 LoAlert为1时LoAlertIrq置1
{
if (InLenByte>32)
{
Write_FIFO(32,pInData);
InLenByte=InLenByte-32;
pInData=pInData+32;
}
else
{
Write_FIFO(InLenByte,pInData);
InLenByte=0;
}
Set_BitMask(BitFramingReg,0x80);//启动发送
Write_Reg(ComIrqReg,0x04);//清除LoAlertIrq
}
if(irq&0x08) //HiAlertIRq Status!Reg中bit1 HiAlert=(64-FIFOLength)<=WaterLevel(0x20)置1,ComIRqReg中bit3 HiAlert为1时HiAlertIRq置1
{
if((irq&0x40)&&(InLenByte==0)&&(Read_Reg(FIFOLevelReg)>32))//TxIRq + 待发送长度为0 + FIFO长度大于32
{
Read_FIFO(32,pOutData+rx_len);
FM175XX-STM8硬件SPI.rar_FM7520的SPI频率_STM8-SPI_fm17520spi问题_fm175xx
版权申诉
5星 · 超过95%的资源 15 浏览量
2022-07-13
22:20:39
上传
评论
收藏 335KB RAR 举报
我虽横行却不霸道
- 粉丝: 72
- 资源: 1万+
最新资源
- 使用 C 语言实现的计算非负整数的阶乘
- 2011-2021最新版本北京大学数字普惠金融指数(PKU-DFIIC).xlsx
- 县域数字乡村指数2018-2020(1).xlsx
- Docker容器配置进阶
- tensorflow-gpu-2.7.4-cp37-cp37m-manylinux2010-x86-64.whl
- 多段线、 圆、弧转多段线(仅我可见)
- tensorflow-2.7.2-cp38-cp38-manylinux2010-x86-64.whl
- 李慧琴C语言基础部分.zip
- yeyue-p8Yi4-ve4a83792.apk
- tensorflow-gpu-2.7.3-cp38-cp38-manylinux2010-x86-64.whl
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论1