找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 340|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

關(guān)于25AA020A器件寫入數(shù)據(jù)時(shí),程序需要死等

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
  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. }
復(fù)制代碼



各位大佬們,我加粗部分代碼是寫入25AA020A這個(gè)器件時(shí),需要等待這個(gè)狀態(tài),有啥辦法不讓他死等來(lái)查詢這個(gè)狀態(tài)位嗎
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1143041 發(fā)表于 2025-4-26 20:46 | 只看該作者
還有在UART中,需要查詢while(TI),while(RI),有什么辦法可以避免這種阻塞代碼嗎,謝謝大佬們的解答
回復(fù)

使用道具 舉報(bào)

板凳
ID:1109793 發(fā)表于 2025-4-27 07:45 | 只看該作者
不死鳥a 發(fā)表于 2025-4-26 20:46
還有在UART中,需要查詢while(TI),while(RI),有什么辦法可以避免這種阻塞代碼嗎,謝謝大佬們的解答

用中斷方式嘛
回復(fù)

使用道具 舉報(bào)

地板
ID:879348 發(fā)表于 2025-4-27 10:19 | 只看該作者
你說(shuō)的問題,通常高級(jí)芯片都有DMA功能去避免這個(gè)問題
回復(fù)

使用道具 舉報(bào)

5#
ID:446156 發(fā)表于 2025-4-27 10:48 | 只看該作者
不死鳥a 發(fā)表于 2025-4-26 20:46
還有在UART中,需要查詢while(TI),while(RI),有什么辦法可以避免這種阻塞代碼嗎,謝謝大佬們的解答

可以參考下我發(fā)的帖子。串口的解決辦法是使用DMA發(fā)送但是要注意需要判斷DMA是否為忙狀態(tài)也就是說(shuō)不用DMA發(fā)送串口每發(fā)一個(gè)字節(jié)就得判斷一下狀態(tài)然后發(fā)下一個(gè)字節(jié),使用DMA后每發(fā)一幀(一幀數(shù)據(jù)多長(zhǎng)是個(gè)人定義的)需要判斷一下DMA狀態(tài)然后發(fā)下一幀。如果數(shù)據(jù)量不大波特率夠高直接阻塞式發(fā)送也沒事。
回復(fù)

使用道具 舉報(bào)

6#
ID:1143041 發(fā)表于 2025-4-27 14:23 | 只看該作者

問一下大佬有代碼參考一下嘛?
回復(fù)

使用道具 舉報(bào)

7#
ID:1143041 發(fā)表于 2025-4-27 14:23 | 只看該作者
wufa1986 發(fā)表于 2025-4-27 10:19
你說(shuō)的問題,通常高級(jí)芯片都有DMA功能去避免這個(gè)問題

歐克,謝謝大佬
回復(fù)

使用道具 舉報(bào)

8#
ID:1109793 發(fā)表于 2025-4-27 18:06 | 只看該作者
不死鳥a 發(fā)表于 2025-4-27 14:23
問一下大佬有代碼參考一下嘛?

論壇搜一下MODBUS的代碼,我以前看過,應(yīng)該就是中斷的
回復(fù)

使用道具 舉報(bào)

9#
ID:401564 發(fā)表于 2025-4-28 22:52 | 只看該作者
你可以把這個(gè)等待當(dāng)成應(yīng)答,或者寫入完成標(biāo)志位,怎么叫都行,你理解就行了
1: 把寫入一個(gè)完整數(shù)據(jù)(這包括寫下地址,讀寫標(biāo)志等等)和等待分開寫,寫兩個(gè)函數(shù)
2: 聲明一個(gè)僵局位,或者一個(gè)全局u8變量都行,看實(shí)際情況吧,我這行就用  F  來(lái)代替吧, 現(xiàn)在定義規(guī)則: F == 1 就是正在寫入, F !=1  就是寫入完成
3:這個(gè)是你的寫入函數(shù)
  • void E2_WriteByte(unsigned char addr,unsigned char dat)
  • {
  •         unsigned char sta;
  •         SPI_CS = 0;
  •         spiWriteByte(WREN);
  •         SPI_CS = 1;
  •         SPI_CS = 0;
  •         spiWriteByte(WRITE);
  •         spiWriteByte(addr);
  •         spiWriteByte(dat);
  •         SPI_CS = 1;
  •         F = 1://寫入完整的數(shù)據(jù)后,F置位
  • }
這個(gè)是讀取函數(shù),這個(gè)函數(shù)可以是有返回值的,也可以是不返回,在函數(shù)中操作F就可以了有的單片機(jī)返回參數(shù)代碼量和RAM占用多一點(diǎn),對(duì)于幾十B運(yùn)行內(nèi)存的單片機(jī)來(lái)說(shuō),這很重要,看你自己的情況
  • void read(void)
  • {
  •                 SPI_CS = 0;
  •                 spiWriteByte(RDSR);
  •                 sta = spiReadByte();
  •                 SPI_CS = 1;
  •                 if((sta & 0x01) == 0)
  •                 {
  •                         F = 0;
  •                 }
  •         }
那么好,在主程序中就可以通過F的值來(lái)進(jìn)行其它操作了



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表