BeHappy 发表于 2025-1-22 20:45:46

一次清理SPI数据寄存器,导致的错误

<h2>实验环境</h2>
<p>mcu: 8051U, 32-bit模式, 12Mhz</p>
<p>存储器: W25Q64JV</p>
<h2>问题描述</h2>
<p>想通过串口向标准SPI接口的存储器写入数据。初始化标准SPI接口时,因一次无意中的初始化习惯,给寄存器‘SPDAT’赋值为“00H”。这个初始化步骤导致了接下来如果是直接读存储器,读出的数据是错误的,全部为“0FFH”。然而,如果在读存储器之前插入读存储器ID的函数,然后再读存储器,结果就对了,百思不得其解。</p>
<p>开始以为是使能了SPI功能之后,初始化“SPDAT”会导致SPI外设产生自动发送数据的动作。但是我把初始化“SPDAT”的语句放在使能SPI功能之前,问题依旧。再后来,取消片选之后,再初始化“SPDAT”,问题依旧。</p>
<p>唯一的办法的是,注释掉对“SPDAT”寄存器的初始化,结果就读对了。没想通是为什么。</p>

_奶咖君_ 发表于 2025-1-23 10:08:24

为啥要初始化数据寄存器呢?
你往这个寄存器里面写值,就会触发SPI发送动作,,要不你就判断SPI发送完成再进行片选拉低的操作,兴许也没有问题,,

BeHappy 发表于 2025-1-23 10:41:31

_奶咖君_ 发表于 2025-1-23 10:08
为啥要初始化数据寄存器呢?
你往这个寄存器里面写值,就会触发SPI发送动作,,要不你就判断SPI发送完成再 ...

操作习惯吧。可是我把使能SPI功能的语句放在初始化时给“SPDAT”寄存器赋值之后,还是会导致读存储器时读出的数据错误

_奶咖君_ 发表于 2025-1-23 11:21:23

BeHappy 发表于 2025-1-23 10:41
操作习惯吧。可是我把使能SPI功能的语句放在初始化时给“SPDAT”寄存器赋值之后,还是会导致读存储器时读 ...
要不你接上逻辑分析仪?或者示波器,,看看这个SPI是不是不使能情况下,也能向外发送数据

这个确实和想象中有点儿不一样了。。。

BeHappy 发表于 2025-1-23 13:40:41

_奶咖君_ 发表于 2025-1-23 11:21
要不你接上逻辑分析仪?或者示波器,,看看这个SPI是不是不使能情况下,也能向外发送数据

这个确实和想象 ...

正有此意。
使能SPI之前,循环给“SPDAT”赋值,观察SPI的CLK和MOSI针脚,接上示波器观察一下
但是,手头上有其他事情,明天再来更新状态

_奶咖君_ 发表于 2025-1-23 17:05:10

BeHappy 发表于 2025-1-23 13:40
正有此意。
使能SPI之前,循环给“SPDAT”赋值,观察SPI的CLK和MOSI针脚,接上示波器观察一下
但是,手头 ...

{:xiaoku:}蹲一个更新

BeHappy 发表于 2025-1-24 00:29:02

_奶咖君_ 发表于 2025-1-23 17:05
蹲一个更新
拿示波器观察了,不好的消息,给寄存器“SPDAT”赋值,的确会触发SPI外设的始终针脚输出时钟 :-(

SPI外设初始化期间实验的代码:
SPICONF:
    SETB    SS
    /*
    SPI func pins selection
    SS --> P1.4
    MOSI --> P1.5
    MISO --> P1.6
    SCLK --> P1.7
    */
    ANL   P_SW1, #NOT 0CH
    /*
    ignore SS pin
    MSB first
    */
    MOV   SPCTL, #1101$1101B
    MOV   SPSTAT, #0C0H
   
    MOV   R7, #9D
    L1:
    ; clean SPDAT register
    MOV   SPDAT, #00H
    MOV   R5, #1D
    CALL    DELAYMS
    DJNZ    R7, L1
    ; disable SPI interrupt
    ANL   IE2, #NOT 02H
    RET

_奶咖君_ 发表于 2025-1-24 08:49:30

{:fadai:}意料之外,,是没有开启SPI使能位的情况下么?很抱歉,不是很熟悉汇编。

BeHappy 发表于 2025-1-24 10:21:11

_奶咖君_ 发表于 2025-1-24 08:49
意料之外,,是没有开启SPI使能位的情况下么?很抱歉,不是很熟悉汇编。

使能了SPI外设。在第15行使能了

_奶咖君_ 发表于 2025-1-24 10:50:59

BeHappy 发表于 2025-1-24 10:21
使能了SPI外设。在第15行使能了

{:cahan:}使能了 会往外发送数据不是很正常么,,,我再想的是不能使能SPI的情况下,给数据寄存器赋值了,,还会往外发送数据么。。
页: [1] 2
查看完整版本: 一次清理SPI数据寄存器,导致的错误