极限零 发表于 2024-9-29 11:36

大佬们帮我看看我这MicroPython代码有什么问题

<p>要做的是用ESP32S3作为主机与一个安全芯片进行SPI通信,目前的问题是:数据成功发出,安全芯片也成功返回数据,但其返回的0x55我ESP没有收到</p>

<p>&nbsp;</p>

<p>芯片资料给出的通信流程如下图</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">&nbsp;</div>

<div>我的代码如下,测试用代码,大佬们帮看看有什么问题</div>

<div>
<pre>
<code class="language-python">from machine import Pin, SPI
from time import sleep_us

class myESAM():
    def __init__(self):
      self.sck = Pin(11, Pin.PULL_UP)
      self.mosi = Pin(13, Pin.PULL_UP)
      self.miso = Pin(12)
      self.spi = SPI(1, sck=self.sck, mosi=self.mosi, miso=self.miso, baudrate=5000000,polarity=1, phase=1)
      self.nss = Pin(10, Pin.OUT, Pin.PULL_UP)
      
    def start(self):
      _thread.start_new_thread(self.read,())
      self.nss.value(0)
      sleep_us(100)
      buf =
      self.spi.write(buf)
      sleep_us(5)
      self.nss.value(1)
      sleep_us(10)
      self.nss.value(0)
      sleep_us(100)
                while True:
            inBuf = bytearray(1)
            self.spi.readinto(inBuf)
            if inBuf != b'\x55':
                sleep_us(20)
                continue
            print(inBuf)
            inBuf = bytearray(20)
            self.spi.readinto(inBuf)
            print(inBuf)
            sleep_us(5)
            self.nss.value(1)
            sleep_us(10)
            break


m = myESAM()
m.start()


</code></pre>

<p>&nbsp;</p>
</div>

<p>&nbsp;</p>

极限零 发表于 2024-9-29 11:39

<p>安全芯片 SPI 工作方式采用 MODE 3,时钟极性(CPOL=1),串行同步时钟的空闲状态为高电平,时钟相位(CPHA=1),在串行同步时钟的下降沿转换数据,上升沿采样数据。</p>

<p>支持频率为5Mhz-20Mhz</p>

极限零 发表于 2024-9-29 16:15

<p>大召唤术 <span class="mentions">@dcexpert </span>&nbsp;</p>

<p>看看是我的写法有问题吗,第一次用ESP的SPI,搞不懂啊</p>

wangerxian 发表于 2024-9-29 17:38

<p>片选需要在通信过程中拉高一次?</p>

dcexpert 发表于 2024-9-29 20:48

<p>不清楚你芯片的时序要求,可以试试 spi.write_readinto(txdata, rxdata) 函数,写入同时读取。</p>

极限零 发表于 2024-9-30 09:00

dcexpert 发表于 2024-9-29 20:48
不清楚你芯片的时序要求,可以试试 spi.write_readinto(txdata, rxdata) 函数,写入同时读取。

<p>忘了加时序图,现补上,发送是同时读取也试过,读回来的全是0</p>

<div>紫色为 MOSI、黄色为 SSN、绿色为 CLK、红色为 MISO</div>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

极限零 发表于 2024-9-30 09:02

<div class='shownolgin' data-isdigest='no'>wangerxian 发表于 2024-9-29 17:38
片选需要在通信过程中拉高一次?

<p>这个芯片特殊,比较奇怪,不过按他的要求步骤走,他确实返回数据了,可我没接到</p>
</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

wangerxian 发表于 2024-9-30 09:37

<div class='shownolgin' data-isdigest='no'>极限零 发表于 2024-9-30 09:02
这个芯片特殊,比较奇怪,不过按他的要求步骤走,他确实返回数据了,可我没接到

<p>是通过抓波形确认它确实返回数据吗?</p>
</div><script>showreplylogin();</script>

极限零 发表于 2024-9-30 09:52

<div class='shownolgin' data-isdigest='no'>wangerxian 发表于 2024-9-30 09:37
是通过抓波形确认它确实返回数据吗?

<p>是的,但是我这只有单通道的示波器,所以目前时序还搞不清楚</p>
</div><script>showreplylogin();</script>

wangerxian 发表于 2024-9-30 10:22

<div class='shownolgin' data-isdigest='no'>极限零 发表于 2024-9-30 09:52
是的,但是我这只有单通道的示波器,所以目前时序还搞不清楚

<p>可以搞个便宜的逻辑分析仪,几十块,抓时许还是很有用的。</p>
</div><script>showreplylogin();</script>

极限零 发表于 2024-9-30 10:30

<div class='shownolgin' data-isdigest='no'>wangerxian 发表于 2024-9-30 10:22
可以搞个便宜的逻辑分析仪,几十块,抓时许还是很有用的。

<p>已经提了,公司买东西时间比较长。。。。。</p>
</div><script>showreplylogin();</script>

dcexpert 发表于 2024-9-30 10:48

<div class='shownolgin' data-isdigest='no'>极限零 发表于 2024-9-30 09:00
忘了加时序图,现补上,发送是同时读取也试过,读回来的全是0

紫色为 MOSI、黄色为 SSN、绿色为 CLK、 ...

<p>如果有波形而读取不到数据,可以多检查IO设置、波特率、spi相位等参数。</p>
</div><script>showreplylogin();</script>

wangerxian 发表于 2024-9-30 11:29

<div class='shownolgin' data-isdigest='no'>极限零 发表于 2024-9-30 10:30
已经提了,公司买东西时间比较长。。。。。

<p>那盲猜不好猜问题,micropython可以调试吗?</p>
</div><script>showreplylogin();</script>

极限零 发表于 2024-9-30 14:35

<div class='shownolgin' data-isdigest='no'>dcexpert 发表于 2024-9-30 10:48
如果有波形而读取不到数据,可以多检查IO设置、波特率、spi相位等参数。

<p>下午去隔壁楼借了个示波器,搞明白了,我用的是SPI1,就是HSPI,而管脚是自定义的,只有第一次运行时,完全正常,其后只要不改SPI初始化的代码,不管是怎样都不能再收到数据,掉电重启也不行</p>

<p>我改用SPI2后,就完全正常了</p>

<p>不知道是不是BUG,而且用SPI1时,设置的频率与实际频率也不符,我设置的5MHz,示波器看只有4MHz,后来我设成10MHz,示波器只有9MHz</p>

<p>感谢 <span class="mentions">@dcexpert&nbsp;&nbsp; </span>@wangerxian </p>
</div><script>showreplylogin();</script>

dcexpert 发表于 2024-9-30 15:20

<div class='shownolgin' data-isdigest='no'>极限零 发表于 2024-9-30 14:35
下午去隔壁楼借了个示波器,搞明白了,我用的是SPI1,就是HSPI,而管脚是自定义的,只有第一次运行时,完 ...

<p>看来是固件的bug</p>
</div><script>showreplylogin();</script>

wangerxian 发表于 2024-9-30 15:22

<div class='shownolgin' data-isdigest='no'><p>【设置的频率与实际频率也不符,我设置的5MHz,示波器看只有4MHz】有没可能是SPI1用的时钟源不同?</p>
</div><script>showreplylogin();</script>

极限零 发表于 2024-9-30 15:26

<div class='shownolgin' data-isdigest='no'>wangerxian 发表于 2024-9-30 15:22
【设置的频率与实际频率也不符,我设置的5MHz,示波器看只有4MHz】有没可能是SPI1用的时钟源不同?

<p>但是我SPI2又正常,我是ESP32S3-WROOM-1U,这里有好几个时钟源吗</p>
</div><script>showreplylogin();</script>

wangerxian 发表于 2024-10-8 10:51

<div class='shownolgin' data-isdigest='no'>极限零 发表于 2024-9-30 15:26
但是我SPI2又正常,我是ESP32S3-WROOM-1U,这里有好几个时钟源吗

<p>ESP32好像时钟源基本不用配置,那就不知道是什么问题了</p>
</div><script>showreplylogin();</script>
页: [1]
查看完整版本: 大佬们帮我看看我这MicroPython代码有什么问题