将45DB161数据闪存与89LP4052控制器进行接口连接

get 发布于 2019-11-10 embedded 最后更新 2019-11-10 12:10 96 浏览

我试图将数据闪存与89lp 4052控制器连接。 Crysal使用11.0592 mhz。 该控制器内置spi总线。 我尝试了CPHA和CPOL的所有组合。尝试模式0以及模式3.无法读取状态寄存器。 有时会发生它读取寄存器但有时它只是从闪存中编码。 我的代码如下。

                        CLR     SCLK
        CLR     CS
        LCALL       DELAY2      
;; ================================================ ============================== WRITE_FLASH:MOV 20H,#0D7H;命令             LCALL SEND_CLOCK_ONE             LCALL READ_FLASH             CLR SCON.1             MOV A,21H             MOV SBUF,A             JNB SCON.1,$             CLR SCON.1 ;; ================================================ =======================             SETB CS             CLR SCLK             LCALL DELAY2             CLR CS;再次选择             MOV 20H,#84H             LCALL SEND_CLOCK             MOV 20H,#00H             LCALL SEND_CLOCK
            MOV 20H,#00H             LCALL SEND_CLOCK
            MOV 20H,#00H             LCALL SEND_CLOCK
            MOV 20H,#33H             LCALL SEND_CLOCK             LCALL DELAY2             SETB CS             LCALL DELAY2             CLR SCLK             CLR CS;再次选择             MOV 20H,#0D4H             LCALL SEND_CLOCK
            MOV 20H,#00H             LCALL SEND_CLOCK
            MOV 20H,#00H             LCALL SEND_CLOCK
            MOV 20H,#00H             LCALL SEND_CLOCK
            MOV 20H,#00H             LCALL SEND_CLOCK_ONE
        LCALL       READ_FLASH
        CLR     SCON.1
        MOV     A,21H
        MOV     SBUF,A
        JNB     SCON.1,$
        CLR     SCON.1
        SETB        CS
        SETB        SCLK
        LCALL       DELAY2
    LJMP        REP

;; ================================================ ======================= SEND_CLOCK_ONE:MOV C,07H; MSB             MOV DOUT,C             LCALL PULSE_SEND             MOV C,06H             MOV DOUT,C             LCALL PULSE_SEND             MOV C,05H             MOV DOUT,C             LCALL PULSE_SEND             MOV C,04H             MOV DOUT,C             LCALL PULSE_SEND             MOV C,03H             MOV DOUT,C             LCALL PULSE_SEND             MOV C,02H             MOV DOUT,C             LCALL PULSE_SEND             MOV C,01H             MOV DOUT,C             LCALL PULSE_SEND
            MOV C,00H             MOV DOUT,C             LCALL PULSE_SEND_LAST             RET ;; ================================================ =========================== READ_FLASH:LCALL PULSE_SEND MOV C,DIN             MOV 0FH,C             LCALL PULSE_SEND             MOV C,DIN             MOV 0EH,C             LCALL PULSE_SEND             MOV C,DIN             MOV 0DH,C             LCALL PULSE_SEND             MOV C,DIN             MOV 0CH,C             LCALL PULSE_SEND             MOV C,DIN             MOV 0BH,C             LCALL PULSE_SEND             MOV C,DIN             MOV 0AH,C             LCALL PULSE_SEND             MOV C,DIN             MOV 09H,C             LCALL PULSE_SEND             MOV C,DIN             MOV 08H,C             LCALL PULSE_SEND             RET ;; ================================================ ======================= SEND_CLOCK:MOV C,07H; MSB             MOV DOUT,C             LCALL PULSE_SEND             MOV C,06H             MOV DOUT,C             LCALL PULSE_SEND             MOV C,05H             MOV DOUT,C             LCALL PULSE_SEND             MOV C,04H             MOV DOUT,C             LCALL PULSE_SEND             MOV C,03H             MOV DOUT,C             LCALL PULSE_SEND             MOV C,02H             MOV DOUT,C             LCALL PULSE_SEND             MOV C,01H             MOV DOUT,C             LCALL PULSE_SEND
            MOV C,00H             MOV DOUT,C             LCALL PULSE_SEND             RET ;; ================================================ =========================== DELAY2:mov 56H,#0FFH             DJNZ 56H,$             mov 56H,#0FFH             DJNZ 56H,$             RET ;; ================================================ =================== PULSE_SEND:SETB SCLK             LCALL DELAY2             CLR SCLK             LCALL DELAY2             RET ;; ================================================ === PULSE_SEND_LAST:SETB SCLK             LCALL DELAY2             RET ;; ================================================ ===== PULSE_READ_FIRST:CLR SCLK             LCALL DELAY2             SETB SCLK             LCALL DELAY2             RET ;; ================================================ =========== 结束

已邀请:

jalias

赞同来自:

当我编写类似的Flash芯片时,我有类似的症状。 我的问题是,我没有初始化其他芯片(RTC,UART等)的其他芯片选择线,所以它们默认为低。低芯片选择允许这些芯片驱动MISO(主输入,输出)数据线,这样微控制器就无法读取任何信息。

svelit

赞同来自:

带出你的oscope,查看SPI总线(clk信号和你的控制器的DO)。您的闪存数据表有一个时序图,显示数据应如何输入和输出(在每个时钟周期的边沿或中点),在什么边缘以及总线应该空闲的位置。 然后调整控制器上的设置,直到您从控制器中看到的内容与您在闪存数据表中看到的相匹配。 最后,仔细阅读闪存数据表,它可能有类似的东西,它需要8位块或24位块的数据,然后CS(芯片选择)引脚被提升到结束并锁存数据。确保只在闪存需要时才这样做。 然后,它会工作。 :-) 祝你好运。