娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月22日(星期四)

2020年05月22日 | STM32F407使用MFRC522射頻卡調(diào)試及程序移植成功

發(fā)布者:CelestialMagic 來源: eefocus關(guān)鍵字:STM32F407  MFRC522  射頻卡  程序移植 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

本學(xué)期感測(cè)技術(shù)選修課需要做一個(gè)作品出來,用到了MFRC522射頻卡模塊,經(jīng)歷一個(gè)星期的調(diào)試,終于可以正常使用并尋卡成功了了。 成功的把C51的程序移植到了STM32上面。 現(xiàn)在分享一下調(diào)試過程


1、操作環(huán)境

我所使用的是STM32F407的開發(fā)板,使用STM32CubeMX配置初始代碼。 MFRC522使用軟件模擬SPI通信

在這里插入圖片描述

在這里插入圖片描述

2、關(guān)于引腳的配置

淘寶買來的模塊,店家都會(huì)送資料 ,也可以點(diǎn)下面連接保存至網(wǎng)盤


鏈接:http://pan.baidu.com/s/1boMyMlx


1、SPI通信引腳


NSS(SDA)       --------->> 片選信號(hào)

SCK            --------->> 時(shí)鐘信號(hào)

MOSI           --------->> 信號(hào)輸出端(即單片機(jī)引腳設(shè)置為輸入,MFRC522該引腳輸出)

MISO           --------->> 信號(hào)輸入端

在這里插入圖片描述

(上圖截圖于數(shù)據(jù)手冊(cè),移植別人的程序最好看一下所使用的芯片的數(shù)據(jù)手冊(cè),很有用,方便自己理解程序)


這里說明一下,在 MFRC522數(shù)據(jù)手冊(cè)里面說了, MFRC522需要工作在從機(jī)模式下。  

所以MFRC522這個(gè)模塊就是從機(jī)(Slave),而所使用的單片機(jī)就是主機(jī)(Master)


這就是為什么上面的MOSI對(duì)應(yīng)的單片機(jī)引腳要設(shè)置為輸出,(Master Output Slave Input)

MISO信號(hào)輸入端是指的輸入給單片機(jī)了


2、通信時(shí)序

在這里插入圖片描述

這是數(shù)據(jù)手冊(cè)里面的,一定要注意時(shí)序的正確性


片選信號(hào)在數(shù)據(jù)寫入期間一定要保持低電平,而無數(shù)據(jù)時(shí)(即空閑狀態(tài))必須保持高電平


強(qiáng)調(diào):時(shí)序很重要

時(shí)序出錯(cuò),一切都白扯


3、程序流程

在這里插入圖片描述

下面我把我用STM32CubeMX的配置貼出來

在這里插入圖片描述

一定要注意按照這樣配置,因?yàn)閿?shù)據(jù)手冊(cè)里面的時(shí)序要求是NSS(SDA)引腳默認(rèn)狀態(tài)必須是高電平,即1,所以IO口設(shè)置必須為High, 且上拉,其他引腳同理,只是不需要上拉了


3、下面先貼一下尋卡結(jié)果

S50的卡是0x04000, 所以打印的就是40了

在這里插入圖片描述

主函數(shù)里面程序


int main(void)

{

  /* USER CODE BEGIN 1 */

unsigned char status,i;

unsigned int temp;

  /* USER CODE END 1 */


  /* MCU Configuration--------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* USER CODE BEGIN Init */


  /* USER CODE END Init */


  /* Configure the system clock */

  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */

  

  printf("The USART Is Ok!!!rn");

  

  //  下面進(jìn)行的是初始化

  PcdReset();

  PcdAntennaOff(); //關(guān)閉天線

  PcdAntennaOn();  //開啟天線

  M500PcdConfigISOType('A');  // 選擇工作方式

  printf("開始尋卡... ...rn");

  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */

  

  status = PcdRequest(PICC_REQALL, g_ucTempbuf);//尋卡

  if (status == MI_ERR)     // 如果尋卡失敗,則重新初始化 然后continue 繼續(xù)尋卡

  {

  PcdReset();

  PcdAntennaOff(); //關(guān)閉天線

  PcdAntennaOn();  //開啟天線

  M500PcdConfigISOType('A');

  continue;

  }  

  

  // 如果尋卡成功  則LED1閃爍   然后串口打印出來卡的類型

  HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);

  HAL_Delay(10);

  HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);

  HAL_Delay(10);

  HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);

  HAL_Delay(10);

  HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);

  HAL_Delay(10);

  printf("rn卡的類型:");

  for (i = 0; i < 2; i++)

  {

  temp = g_ucTempbuf[i];

  printf("%X", temp);

  }

  //PcdHalt();

  }

  /* USER CODE END 3 */

}


下面是我移植的底層驅(qū)動(dòng)程序,應(yīng)該也是大部分人想要的吧,不過最好還是自己好好看看那手冊(cè)改一下


我只貼出有關(guān)SPI通訊的程序,其他部分跟我上面給出的網(wǎng)盤資料里面的C51例程是差不多的,通用


/*******************************************************************

 @func : ReadRawRC

 @brief : 讀RC632寄存器

 @pram : Address[IN]:寄存器地址

 @retval : 讀出的值

 @NOTE : MFRC522數(shù)據(jù)手冊(cè).pdf 10.2是關(guān)于SPI的詳細(xì)說明   10.2.2 Read data

: unsigned char === uint8_t

 @Call : 內(nèi)部調(diào)用

*******************************************************************/

unsigned char ReadRawRC(unsigned char Address) 

{

     unsigned char i, ucAddr;

     unsigned char ucResult=0;

   

HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_RESET);// MF522_NSS = 0;

HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);// MF522_SCK = 0;

 

 

// 地址左移一位是因?yàn)長(zhǎng)SB是要保留 即RFU位(Reserved for Future Use)

// &0x7E 是把bit1~bit6 的地址(address)寫入

// |0x80 是為了使最高位為1   1(Read) 0(Write) 即使能 '讀'

     ucAddr = ((Address<<1)&0x7E)|0x80;

 

for(i=8;i>0;i--)

{

if((ucAddr&0x80)==0x80)

{

HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, GPIO_PIN_SET);

}

else

{

HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, GPIO_PIN_RESET);

}

HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET);

ucAddr <<= 1;

HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);


}

 

for(i=8;i>0;i--)

{

HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET);

ucResult <<= 1;

ucResult |= HAL_GPIO_ReadPin(MISO_GPIO_Port, MISO_Pin);

HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);

// 有人說對(duì)于STM32這里需要加一句延時(shí),這個(gè)是沒必要的  這個(gè)我經(jīng)過測(cè)試是可以使用的,不用延時(shí)

}


      

     HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_SET);// MF522_NSS = 1;

HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET);// MF522_SCK = 1; 

 

 

     return ucResult;

}




/*******************************************************************

 @func : WriteRawRC

 @brief : 寫RC632寄存器

 @pram : Address[IN]:寄存器地址

: value[IN]:寫入的值

 @retval : None

 @Call : 內(nèi)部調(diào)用

*******************************************************************/

void WriteRawRC(unsigned char Address, unsigned char value)

{  

    unsigned char i, ucAddr;

HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);// MF522_SCK = 0;

HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_RESET);// MF522_NSS = 0;

ucAddr = ((Address << 1) & 0x7E);

for(i=8;i>0;i--)

{

if ((ucAddr&0x80)==0x80)

{

HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, GPIO_PIN_SET);

}

else

{

HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, GPIO_PIN_RESET);

}

HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET);

ucAddr <<= 1;

HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);

}

    

for(i=8;i>0;i--)

{

// MF522_SI = ((value&0x80)==0x80);

if ((value&0x80)==0x80)

{

HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, GPIO_PIN_SET);

}

else

{

HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, GPIO_PIN_RESET);

}

HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET);

value <<= 1;

HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);

}

    

 

HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_SET);// MF522_NSS = 1; 

HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET);// MF522_SCK = 1;

}


復(fù)位函數(shù)


/*******************************************************************

 @func : PcdReset

 @brief : 復(fù)位RC522

 @pram : None

 @retval : 成功返回MI_OK

 @NOTE : 外部調(diào)用

*******************************************************************/

char PcdReset(void)

{

    /* MF522_RST=1; */

HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_SET);

    HAL_Delay(10);

    /* MF522_RST=0; */

HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_RESET);

    HAL_Delay(10);

    /* MF522_RST=1; */

HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_SET);

    HAL_Delay(10);

    WriteRawRC(CommandReg,PCD_RESETPHASE); // 復(fù)位

    HAL_Delay(10);

    

    WriteRawRC(ModeReg,0x3D);            // 和Mifare卡通訊,CRC初始值0x6363

WriteRawRC(TReloadRegL,30);      // 16位定時(shí)器低位

WriteRawRC(TReloadRegH,0); // 16位定時(shí)器高位

WriteRawRC(TModeReg,0x8D); // 定時(shí)器內(nèi)部設(shè)置

WriteRawRC(TPrescalerReg,0x3E); // 定時(shí)器分頻系數(shù)設(shè)置

WriteRawRC(TxAutoReg, 0x40); // 調(diào)制發(fā)送信號(hào)為100%ASK 調(diào)試的時(shí)候加上這一句試試

    return MI_OK;

}


其他的底層驅(qū)動(dòng)函數(shù)就不需要改了,由于總的代碼量比較長(zhǎng),我就只貼出關(guān)鍵的,其他不需要改的直接參考資料里面的例程即可


我自己移植過來完整的有很多程序的注注釋,有興趣的可以下載一下,不過自己花時(shí)間看看數(shù)據(jù)手冊(cè)打個(gè)注釋是最好的

關(guān)鍵字:STM32F407  MFRC522  射頻卡  程序移植 引用地址:STM32F407使用MFRC522射頻卡調(diào)試及程序移植成功

上一篇:STM32f407---oled屏幕配套取字模軟件使用
下一篇:STM32之寄存器開發(fā)

推薦閱讀

ZipperDown不是系統(tǒng)本身而是第三方App中存在的一個(gè)漏洞  新浪手機(jī)訊 5月17日上午消息,中國的安全團(tuán)隊(duì)盤古實(shí)驗(yàn)室稱,他們發(fā)現(xiàn)了名為“ZipperDown”的App程序漏洞,存在于網(wǎng)易云音樂、QQ音樂、快手等流行App中。  這并非是iOS系統(tǒng)本身的問題,而是來自第三方App。它并不是新漏洞,而是一個(gè)”非常經(jīng)典的安全問題“,其影響取決于具體App和它獲得的權(quán)限...
前 言:日前,《2019年中國第三代半導(dǎo)體材料產(chǎn)業(yè)演進(jìn)及投資價(jià)值研究》白皮書在2019世界半導(dǎo)體大會(huì)期間發(fā)布。報(bào)告指出,2018年在5G、新能源汽車、綠色照明等新興領(lǐng)域蓬勃發(fā)展以及國家政策大力扶持的雙重驅(qū)動(dòng)力下,我國第三代半導(dǎo)體材料市場(chǎng)繼續(xù)保持高速增長(zhǎng),總體市場(chǎng)規(guī)模已達(dá)到5.97億元,同比增長(zhǎng)47.3%。 預(yù)計(jì)未來三年中國第三代半導(dǎo)體材料市場(chǎng)規(guī)模仍將保...
投資界5月22日消息,初心資本宣布完成對(duì)宇樹科技(Unitree Robotics)的Pre-A+輪增資,老股東紅杉資本繼續(xù)追投。在2019年底,宇樹科技獲得紅杉中國種子基金數(shù)千萬元人民幣Pre-A輪投資。宇樹科技成立于2016年8月,專注于研發(fā)四足機(jī)器人移動(dòng)平臺(tái)以及相關(guān)動(dòng)力系統(tǒng)部件。至今已經(jīng)開發(fā)了Laikago、 Laikago Pro、 AlienGo、 Unitree A1四款機(jī)器人。其中L...
工業(yè)設(shè)計(jì)師Yifan Hu設(shè)計(jì)了一款小米概念手機(jī)。這款手機(jī)的靈感來自于小米在2021年3月宣布的新版品牌Logo。當(dāng)時(shí)小米的這款新Logo在微博等社交媒體引發(fā)熱烈討論,而這款概念手機(jī)似乎遵循了小米Logo的曲線弧度,在方形和圓形之間達(dá)到完美平衡。  仔細(xì)來看,為了達(dá)到視覺統(tǒng)一,這款概念機(jī)甚至把手機(jī)上的功能按鍵也做成了圓形。整機(jī)顯得非常薄,此外...

史海拾趣

問答坊 | AI 解惑

[分享下載]單片機(jī)初學(xué)教程

單片機(jī)初學(xué)教程很少,找了一個(gè)對(duì)初學(xué)者較為合適的PDF文件教程,大家下載吧!…

查看全部問答∨

基于DSPE1的硬件開發(fā)平臺(tái)設(shè)計(jì)

基于DSPE1的硬件開發(fā)平臺(tái)設(shè)計(jì)…

查看全部問答∨

[原創(chuàng)]了解PLC1

1.簡(jiǎn)單介紹一下PLC,了解PLC的產(chǎn)生和發(fā)展電氣電路 PLC――可編程序控制器,它的應(yīng)用是建立在電氣控制系統(tǒng)上的,也就是說是建立在繼電器控制回路的基礎(chǔ)上的。 這是一個(gè)電機(jī)啟動(dòng)/停止的控制回路:電路由選擇開關(guān)SW建立了手動(dòng)操作和自動(dòng)啟動(dòng)兩種啟動(dòng) ...…

查看全部問答∨

DDK原例子Genprint,加為打印處理器(PrintProcessor)后,EMF格式處理問題?

DDK原例子Genprint,加為打印處理器(PrintProcessor)后,EMF格式處理問題: 打印機(jī)驅(qū)動(dòng)的Print Processor設(shè)置為genprint,格式(Default Data Type)選為 NT EMF 1.008. 調(diào)試的時(shí)候執(zhí)行打印的時(shí)候,在PrintDocumentOnPrintProcessor里, ...... ...…

查看全部問答∨

EBoot,正常啟動(dòng),并運(yùn)行起了NK.bin, LCD能顯示Logo圖片(logo文件包含在NK.bin中), 但不能顯示W(wǎng)ince 界面.

掌微的A3 CPU, wince5.0, LCD能顯示Logo圖片(logo文件包含在NK.bin中). EBoot,正常啟動(dòng),并運(yùn)行起了NK.bin, 但不能顯示W(wǎng)ince 界面。 請(qǐng)問如何檢查 WinCE 代碼里面對(duì)LCD控制器有沒有錯(cuò)誤的配置? 如何檢測(cè) FrameBuffer 的物理地址和 Vitual 地址是 ...…

查看全部問答∨

HID設(shè)備異步讀取失敗的問題

    小弟在寫一個(gè)HID設(shè)備識(shí)別讀取的小程序,目前基本功能都已經(jīng)實(shí)現(xiàn),能夠枚舉掃描,通過VID和PID匹配識(shí)別設(shè)備.然后進(jìn)行到讀取數(shù)據(jù)這里的時(shí)候出了問題,請(qǐng)教下各位,幫我分析下看問題可能出在哪。 int CMyUsb2::Read(unsigned char *pBuf,int ...…

查看全部問答∨

Data Abort: coredll.dll內(nèi)存泄露!!!

我加載程序時(shí)候如下 加載模塊: Controller.exe 加載模塊: commctrl.dll 加載模塊: oleaut32.dll 加載模塊: ole32.dll 加載模塊: coredll.dll 加載模塊: aygshell.dll Platform Type : PLATFORM_TYPE Data Abort: Thread=835d5000 Proc=8202 ...…

查看全部問答∨

還是那個(gè)多路視頻的問題

上次說的可能不夠詳細(xì) 我現(xiàn)在是要在一臺(tái)電腦上插多個(gè)攝像頭完成采集,壓縮,傳輸?shù)裙ぷ? 現(xiàn)在想使用capDriverConnect函數(shù)來選擇使用哪個(gè)攝像頭但是現(xiàn)在不知道如何獲取攝像頭的索引。…

查看全部問答∨

Verilog寫的異步FIFO程序

//-----------------------------------------------------   2 // Design Name : syn_fifo   3 // File Name   : syn_fifo.v   4 // Function    : Synchronous (single clock) FIFO  ...…

查看全部問答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 威海市| 库尔勒市| 古交市| 静安区| 行唐县| 泸州市| 武宁县| 库伦旗| 县级市| 襄垣县| 洪江市| 庐江县| 宜城市| 临夏市| 衡水市| 大田县| 绥宁县| 开江县| 永寿县| 密云县| 安图县| 定远县| 泗水县| 张家界市| 美姑县| 宝鸡市| 和硕县| 安溪县| 法库县| 海城市| 新宾| 顺义区| 萨迦县| 商南县| 吉木萨尔县| 夏邑县| 昌乐县| 漳州市| 门头沟区| 贞丰县| 湛江市|