一次清理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>
为啥要初始化数据寄存器呢?
你往这个寄存器里面写值,就会触发SPI发送动作,,要不你就判断SPI发送完成再进行片选拉低的操作,兴许也没有问题,, _奶咖君_ 发表于 2025-1-23 10:08
为啥要初始化数据寄存器呢?
你往这个寄存器里面写值,就会触发SPI发送动作,,要不你就判断SPI发送完成再 ...
操作习惯吧。可是我把使能SPI功能的语句放在初始化时给“SPDAT”寄存器赋值之后,还是会导致读存储器时读出的数据错误 BeHappy 发表于 2025-1-23 10:41
操作习惯吧。可是我把使能SPI功能的语句放在初始化时给“SPDAT”寄存器赋值之后,还是会导致读存储器时读 ...
要不你接上逻辑分析仪?或者示波器,,看看这个SPI是不是不使能情况下,也能向外发送数据
这个确实和想象中有点儿不一样了。。。
_奶咖君_ 发表于 2025-1-23 11:21
要不你接上逻辑分析仪?或者示波器,,看看这个SPI是不是不使能情况下,也能向外发送数据
这个确实和想象 ...
正有此意。
使能SPI之前,循环给“SPDAT”赋值,观察SPI的CLK和MOSI针脚,接上示波器观察一下
但是,手头上有其他事情,明天再来更新状态 BeHappy 发表于 2025-1-23 13:40
正有此意。
使能SPI之前,循环给“SPDAT”赋值,观察SPI的CLK和MOSI针脚,接上示波器观察一下
但是,手头 ...
{:xiaoku:}蹲一个更新 _奶咖君_ 发表于 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
{:fadai:}意料之外,,是没有开启SPI使能位的情况下么?很抱歉,不是很熟悉汇编。 _奶咖君_ 发表于 2025-1-24 08:49
意料之外,,是没有开启SPI使能位的情况下么?很抱歉,不是很熟悉汇编。
使能了SPI外设。在第15行使能了 BeHappy 发表于 2025-1-24 10:21
使能了SPI外设。在第15行使能了
{:cahan:}使能了 会往外发送数据不是很正常么,,,我再想的是不能使能SPI的情况下,给数据寄存器赋值了,,还会往外发送数据么。。
页:
[1]
2