MFRC500的驱动程序

      近几天来,一直在看MFRC500的PDF。感觉要真的写好这个程序是很难,毕竟需要注意的地方太多了。之后参考了飞利浦的程序,还有imzhangx的程序(原帖地址http://imzhangxp.blog.163.com/blog/static/9460190620095311846396/),甚至参考复旦微电子的FM1702。看了不少51程序之后,我基本完成了程序这一块,只是写完了,但还没有进行调试,毕竟现在PC版版子还在做,等硬件下来才能知道结果。

     不管什么芯片,若需要对其进行读写,那么就得好好看看时序图,最好有程序供参考。

MFRC500的驱动程序 - wehat1148158886 - 子诺
       上图独立读写时序图,注意A2接为高,A1,A0为低。
       飞利浦的程序,读写函数就1句话,
       读: #define ReadRawIO(addr) (*(GpBase + addr));  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MFRC522是一种高频RFID读写器,可以通过SPI接口与FPGA进行通信。以下是使用Verilog HDL编写的MFRC522驱动程序的示例代码: ```verilog module mfrc522 ( input wire clk, input wire reset, output wire sda, // SPI数据线 output wire sck, // SPI时钟线 input wire cs, // 片选信号 input wire irq, // 中断信号 input wire rst, // 复位信号 input wire mosi, // SPI主机输出从机输入 output wire miso // SPI主机输入从机输出 ); // 定义MFRC522的命令 localparam CMD_IDLE = 0; localparam CMD_TRANSCEIVE = 0x0C; localparam CMD_MFAUTHENT = 0x0E; reg [7:0] cmd; reg [7:0] tx_data; reg [7:0] rx_data; reg [7:0] rx_len; // MFRC522的状态机 reg [7:0] state; localparam STATE_IDLE = 0; localparam STATE_WAIT_IRQ = 1; localparam STATE_SEND_CMD = 2; localparam STATE_SEND_DATA = 3; localparam STATE_RECV_DATA = 4; // SPI的状态机 reg [3:0] spi_state; localparam SPI_IDLE = 0; localparam SPI_SEND = 1; localparam SPI_RECV = 2; localparam SPI_WAIT = 3; // 初始化MFRC522 initial begin cmd <= CMD_IDLE; state <= STATE_IDLE; spi_state <= SPI_IDLE; end // MFRC522的状态转换 always @(posedge clk) begin case (state) STATE_IDLE: begin if (cs == 0) begin state <= STATE_WAIT_IRQ; end end STATE_WAIT_IRQ: begin if (irq == 0) begin cmd <= CMD_TRANSCEIVE; tx_data <= 8'h26; // 发送命令:请求天线 rx_len <= 2; // 接收数据:ATQA state <= STATE_SEND_CMD; end end STATE_SEND_CMD: begin if (spi_state == SPI_IDLE) begin spi_state <= SPI_SEND; end if (spi_state == SPI_WAIT) begin spi_state <= SPI_RECV; state <= STATE_SEND_DATA; end end STATE_SEND_DATA: begin if (spi_state == SPI_IDLE) begin spi_state <= SPI_SEND; end if (spi_state == SPI_WAIT) begin spi_state <= SPI_RECV; state <= STATE_RECV_DATA; end end STATE_RECV_DATA: begin if (spi_state == SPI_IDLE) begin spi_state <= SPI_SEND; end if (spi_state == SPI_WAIT) begin spi_state <= SPI_RECV; state <= STATE_IDLE; end end endcase end // SPI的状态转换 always @(posedge clk) begin case (spi_state) SPI_IDLE: begin sck <= 1; sda <= 1; miso <= 1; if (cs == 0) begin spi_state <= SPI_SEND; end end SPI_SEND: begin sck <= 0; if (cmd != CMD_IDLE) begin sda <= tx_data[7]; tx_data <= {tx_data[6:0], 1'b0}; end spi_state <= SPI_RECV; end SPI_RECV: begin sck <= 1; rx_data <= {miso, rx_data[7:1]}; spi_state <= SPI_WAIT; end SPI_WAIT: begin sck <= 0; if (rx_len == 0) begin cmd <= CMD_IDLE; spi_state <= SPI_IDLE; end else begin rx_len <= rx_len - 1; spi_state <= SPI_RECV; end end endcase end endmodule ``` 在这个示例中,MFRC522的状态机分为了五个阶段:空闲状态、等待中断信号、发送命令、发送数据、接收数据。SPI的状态机分为了四个阶段:空闲状态、发送数据、接收数据、等待。当FPGA选择MFRC522进行通信时,会进入空闲状态,等待片选信号(cs)变为低电平。然后进入等待中断信号阶段,等待MFRC522请求天线,并接收ATQA信息。发送命令和发送数据阶段是通过SPI接口来完成的,发送命令时将命令放入SPI的数据线,发送数据时将数据放入SPI的数据线,然后通过等待机制等待MFRC522的回应。接收数据阶段则是将数据从SPI接口中读取出来。在每个时钟周期中,状态机会根据当前状态和输入信号来判断是否需要进行状态转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值