标题: 关于25AA020A器件写入数据时,程序需要死等 [打印本页]

作者: 不死鸟a    时间: 2025-4-26 20:44
标题: 关于25AA020A器件写入数据时,程序需要死等
  1. #include "E2_25AA020A.h"
  2. void E2_WriteByte(unsigned char addr,unsigned char dat)
  3. {
  4.         unsigned char sta;
  5.         SPI_CS = 0;
  6.         spiWriteByte(WREN);
  7.         SPI_CS = 1;
  8.         
  9.         SPI_CS = 0;
  10.         spiWriteByte(WRITE);
  11.         spiWriteByte(addr);
  12.         spiWriteByte(dat);
  13.         SPI_CS = 1;
  14.       <b>  while(1)
  15.         {
  16.                 SPI_CS = 0;
  17.                 spiWriteByte(RDSR);
  18.                 sta = spiReadByte();
  19.                 SPI_CS = 1;
  20.                 if((sta & 0x01) == 0)
  21.                 {
  22.                         break;
  23.                 }
  24.         }</b>
  25. }
复制代码



各位大佬们,我加粗部分代码是写入25AA020A这个器件时,需要等待这个状态,有啥办法不让他死等来查询这个状态位吗

作者: 不死鸟a    时间: 2025-4-26 20:46
还有在UART中,需要查询while(TI),while(RI),有什么办法可以避免这种阻塞代码吗,谢谢大佬们的解答

作者: xiaobendan001    时间: 2025-4-27 07:45
不死鸟a 发表于 2025-4-26 20:46
还有在UART中,需要查询while(TI),while(RI),有什么办法可以避免这种阻塞代码吗,谢谢大佬们的解答

用中断方式嘛
作者: wufa1986    时间: 2025-4-27 10:19
你说的问题,通常高级芯片都有DMA功能去避免这个问题
作者: qinlu123    时间: 2025-4-27 10:48
不死鸟a 发表于 2025-4-26 20:46
还有在UART中,需要查询while(TI),while(RI),有什么办法可以避免这种阻塞代码吗,谢谢大佬们的解答

可以参考下我发的帖子。串口的解决办法是使用DMA发送但是要注意需要判断DMA是否为忙状态也就是说不用DMA发送串口每发一个字节就得判断一下状态然后发下一个字节,使用DMA后每发一帧(一帧数据多长是个人定义的)需要判断一下DMA状态然后发下一帧。如果数据量不大波特率够高直接阻塞式发送也没事。
作者: 不死鸟a    时间: 2025-4-27 14:23
xiaobendan001 发表于 2025-4-27 07:45
用中断方式嘛

问一下大佬有代码参考一下嘛?

作者: 不死鸟a    时间: 2025-4-27 14:23
wufa1986 发表于 2025-4-27 10:19
你说的问题,通常高级芯片都有DMA功能去避免这个问题

欧克,谢谢大佬
作者: xiaobendan001    时间: 2025-4-27 18:06
不死鸟a 发表于 2025-4-27 14:23
问一下大佬有代码参考一下嘛?

论坛搜一下MODBUS的代码,我以前看过,应该就是中断的
作者: Y_G_G    时间: 2025-4-28 22:52
你可以把这个等待当成应答,或者写入完成标志位,怎么叫都行,你理解就行了
1: 把写入一个完整数据(这包括写下地址,读写标志等等)和等待分开写,写两个函数
2: 声明一个僵局位,或者一个全局u8变量都行,看实际情况吧,我这行就用  F  来代替吧, 现在定义规则: F == 1 就是正在写入, F !=1  就是写入完成
3:这个是你的写入函数
这个是读取函数,这个函数可以是有返回值的,也可以是不返回,在函数中操作F就可以了有的单片机返回参数代码量和RAM占用多一点,对于几十B运行内存的单片机来说,这很重要,看你自己的情况
那么好,在主程序中就可以通过F的值来进行其它操作了








欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1