工具/软件:Code Composer Studio
我尝试使用以下代码与 rc520 SPI 外设通信、但在读取 SPI 此处时、我的代码始终为零(我正在使用库、但我只提供我使用的代码):-
#include
#define RC522EN BIT3 //引脚8.3是使能引脚
#define RC522CS BIT0 //引脚4.0是 RESET 引脚
#define RC522READ 0x80 //为读取操作设置位7
#define RC522WRITE 0x7E //位7未设置为写入操作
//Page 1:命令
#define Reserved10 0x10
#define ModeReg 0x11
#define TxModeReg 0x12
#define RxModeReg 0x13
#define TxControlReg 0x14
#define TxAutoReg 0x15
#define TxSelReg 0x16
#define RxSelReg 0x17
#define RxThresholdReg 0x18
#define DemodReg 0x19
#define Reserved11 0x1A
#define Reserved12 0x1B
#define MifareReg 0x1C
#define Reserved13 0x1D
#define Reserved14 0x1E
#define SerialSpeedReg 0x1F
内联 void readRC522 (unsigned char addr、unsigned char *value){
//读取寄存器的值
spitxrx (RC522CS、((addr << 1)& RC522WRITE)| RC522READ、值、1、0);
返回;
}
unsigned char verifyRC522 (unsigned char addr、unsigned char data、unsigned char mask){
unsigned char regval=0;
readRC522 (addr、regval);//始终 regval 为零??????
if ((data&mask)==(regval&mask))返回1;//数据匹配
//错误
返回0;
}
内联 void writeRC522 (unsigned char addr、unsigned char value){
//将特定寄存器设置为值
spitxx (RC522CS、(addr<<1)&RC522WRITE、Value);
返回;
}
void spitxx (int enpin、unsigned char addr、unsigned char data){
P4OUT &=~Ω 引脚;//将 CS 设置为低电平以选择芯片
_DELAY_CYCLES (1000);//等待1毫秒启动
while (UCB0STATW 和 UCBUSY);//确保总线未被使用
UCB0TXBUF=addr;
while (!(UCB0IFG & UCTXIFG));//等待 TX bufer 中的聊天室
UCB0TXBUF=数据;
while (UCB0STATW 和 UCBUSY);//等待通信完成
P4OUT |= ENPIN;//将 CS 设置为高电平以取消选择芯片
_DELAY_CYCLES (1000);//等待1毫秒启动
返回;
}
空 NSSHigh_Low (空)
{
P8OUT &=~RC522EN;
_DELAY_CYCLES (50000);//等待50毫秒以实现完全开启关断
P8OUT |= RC522EN;
_DELAY_CYCLES (50000);//等待50毫秒以启动//退出断电模式。 这将触发硬复位。
//数据 表中的第8.8.2节说明振荡器启动时间是晶体的启动时间
}
空 initClockTo16MHz()
{
//根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
//在配置时钟系统之前在8MHz 以上运行。
FRCTL0 = FRCTLPW | NWAITS_1;
_bis_SR_register (SCG0);//禁用 FLL
CSCTL3 |= SELREF_REFOCLK;//将 REFO 设置为 FLL 基准源
CSCTL0 = 0;//清除 DCO 和 MOD 寄存器
CSCTL1 &=~(DCORSEL_7);//首先清除 DCO 频率选择位
CSCTL1 |= DCORSEL_5;//设置 DCO = 16MHz
CSCTL2 = FLLD_0 + 487;//设置为 fDCOCLKDIV =(FLLN + 1)*(fFLLREFCLK/n)
//=(487 + 1)*(32.768 kHz/1)
//= 16MHz
_DELAY_CYCLES (3);
_BIC_SR_register (SCG0);//启用 FLL
while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));// FLL 锁定
}
int main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
P4DIR = BIT0;
P4OUT = BIT0;
P4SEL0 = 0;
P4REN = 0;
P5DIR = 0;
P5OUT = 0;
P5SEL0 = BIT0 + BIT1 + BIT2 + BIT3;
P5REN = 0;
P6DIR = 0;
P6OUT = 0;
P6SEL0 = 0;
P6REN = 0;
P7DIR = BIT4 | BIT5;
P7OUT = 0;
P7SEL0 = 0;
P7REN = 0;
P8DIR = BIT3;
P8OUT = BIT0;
P8SEL0 = 0;
P8REN = 0;
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
////////////////////////// SPI 初始化
UCB0CTLW0 = UCSWRST;//**将状态机置于复位状态**
UCB0CTLW0 |= UCMST + UCSYNC + UCCKPL + UCMSB;// 3引脚8位 SPI 主 MSB
UCB0CTLW0 |= UCSSEL_2;// SMCLK
UCB0BR0 |= 4;// CLK / 1
UCB0BR1 = 0;
UCB0CTL1 &=~UCSWRST;
//将 RESET 置为高电平并等待芯片唤醒:
NSSHigh_Low ();
writeRC522 (TModeReg、0x8D);//Tauto=1、f (timer)=6.78 MHz/TPrescaler 为8D
writeRC522 (TPrescalerReg、0x3E);//was 3E
writeRC522 (TReloadRegL、1);//was dec30
writeRC522 (TReloadRegH、30);//was 0
writeRC522 (TxAutoReg、0x40);
writeRC522 (ModeReg、0x3D);
writeRC522 (RFCfgReg、regvar[RFCfgRer][0]);//最大功率
writeRC522 (CommandReg、PCD_IDLE);
writeRC522 (FIFOLevelReg、BIT7);//清空 FIFO
if (!verifyRC522 (TModeReg、TModeReg、0x8D){
//错误的 rrrrrrrrrrrrrrrrrrr
}
}
任何支持都将得到执行