本學(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è)注釋是最好的
上一篇:STM32f407---oled屏幕配套取字模軟件使用
下一篇:STM32之寄存器開發(fā)
推薦閱讀
史海拾趣
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 地址是 ...… 查看全部問答∨ |
小弟在寫一個(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 ...… 查看全部問答∨ |
上次說的可能不夠詳細(xì) 我現(xiàn)在是要在一臺(tái)電腦上插多個(gè)攝像頭完成采集,壓縮,傳輸?shù)裙ぷ? 現(xiàn)在想使用capDriverConnect函數(shù)來選擇使用哪個(gè)攝像頭但是現(xiàn)在不知道如何獲取攝像頭的索引。… 查看全部問答∨ |
//----------------------------------------------------- 2 // Design Name : syn_fifo 3 // File Name : syn_fifo.v 4 // Function : Synchronous (single clock) FIFO  ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計(jì)
- 小型傾轉(zhuǎn)旋翼機(jī)的無刷直流電機(jī)驅(qū)動(dòng)器設(shè)計(jì)
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計(jì)
- 基于GPS自動(dòng)授時(shí)的無線智能控制器的設(shè)計(jì)
- 基于PTR2000的無線氣象信息采集系統(tǒng)設(shè)計(jì)
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無人飛行器機(jī)載穩(wěn)定云臺(tái)控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時(shí)處理器M7000
- Gartner發(fā)布企業(yè)構(gòu)建智能應(yīng)用的五項(xiàng)基本原則
- TLSM系列輕觸開關(guān)為高使用率設(shè)備提供200萬次長(zhǎng)使用壽命
- 品英Pickering公司仿真方案和測(cè)試系統(tǒng)滿足航電設(shè)備可靠性和安全性等更高要求
- RAK12039傳感器如何參與LoRaWAN水培環(huán)境監(jiān)測(cè)物聯(lián)網(wǎng)系統(tǒng)集成
- 如何添加和激活RAK12035傳感器(電容式土壤濕度傳感器)
- ?數(shù)據(jù)分析軟件imc FAMOS 2025全球同步發(fā)布
- 基于雙積分滑模控制的單移相調(diào)制(SPS)的應(yīng)用
- 場(chǎng)效應(yīng)管有哪些特點(diǎn)、測(cè)量方法?場(chǎng)效應(yīng)管是如何導(dǎo)通的
- 場(chǎng)效應(yīng)管和晶閘管有什么區(qū)別?場(chǎng)效應(yīng)管使用注意事項(xiàng)有哪些
- 場(chǎng)效應(yīng)管常用驅(qū)動(dòng)芯片有哪些?如何估測(cè)場(chǎng)效應(yīng)管放大能力
- TI模擬博文深度閱讀季,贏小米盒子!
- 【下單全額返現(xiàn),300元封頂,不限產(chǎn)品】MPS商城鉅惠體驗(yàn)季!
- NI labview、CompactDAQ技術(shù)集錦
- 再見2019,你好2020!寫下你的年終總結(jié)和新年計(jì)劃
- 為英飛凌天貓旗艦店慶生|【瀏覽有禮】【下單100%有禮】
- 看是德科技X8711A 物聯(lián)網(wǎng)設(shè)備功能測(cè)試解決方案,答題贏好禮
- 金秋十月,我們跟金爾雅老師學(xué)MSP432
- 一道題,測(cè)試你是不是MSP430的真愛粉兒~
- 答題贏好禮|TI 工業(yè)參考設(shè)計(jì)精選
- 泰克《MIPI物理層測(cè)試》下載有禮!
- 中國5G標(biāo)準(zhǔn)研發(fā)逐漸全球領(lǐng)先
- 手機(jī)“上癮”責(zé)任在誰?戒癮功能真有必要嗎?
- 1550nm激光雷達(dá)幫助自動(dòng)駕駛汽車應(yīng)對(duì)惡劣天氣
- 蘋果USB-C轉(zhuǎn)閃電連接線降價(jià) 暗示新iPhone換快充
- 未來路徑?自動(dòng)駕駛技術(shù)正在催生的五大技術(shù)創(chuàng)新
- AVR單片機(jī)實(shí)現(xiàn)對(duì)步進(jìn)電機(jī)的細(xì)分控制及其應(yīng)用
- 有關(guān)AVR芯片后綴解釋
- AVR單片機(jī)熔絲位的配置
- AVR單片機(jī)性能簡(jiǎn)介
- AVR單片機(jī)硬件電路設(shè)計(jì)方法詳解
- 【PSoC4心得】PSOC4分頻模塊
- 【安信可NB-IoT開發(fā)板EC-01F-Kit測(cè)評(píng)】05.基于STM32+EC-01F Socket通信
- 電子系統(tǒng)設(shè)計(jì)方法
- 怎樣拆卸集成電路塊
- 萬能實(shí)驗(yàn)機(jī)常見故障.......
- 【FPGA小技巧】異步信號(hào)處理代碼
- 要有料:電流探頭和信號(hào)發(fā)生器獲得者的評(píng)測(cè)計(jì)劃公開!儀器已派發(fā),期待6小只的分享
- 學(xué)習(xí)F2812的資料
- 紅外線遙控開關(guān)芯片F(xiàn)LYK-HY01-A的引腳定義?
- 安防技術(shù)與弱電技術(shù)2