久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1669|回復: 13
打印 上一主題 下一主題
收起左側

W25Q32存儲數據時,上位機串口通信異常怎么解決?

[復制鏈接]
回帖獎勵 10 黑幣 回復本帖可獲得 1 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:1104941 發表于 2024-2-29 19:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
每次往25Q32存儲256字節數據,看手冊貌似要200MS(擦除時間久),這是時間上位機有命令來的話,執行串口中斷,會有通信異常。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1111855 發表于 2024-2-29 20:23 | 只看該作者
數據發送中間歇性數據異常漏發亂發
回復

使用道具 舉報

板凳
ID:458247 發表于 2024-3-1 08:43 | 只看該作者
1、如果單片機有dma功能,則用dma接收串口數據
2、25Q32看能不能用狀態機編程,刪除指令發出后不死等,等到下次執行時判斷有沒有擦除成功,若擦除成功了再進行寫操作
3、25Q32的刪除操作看看能不能在程序初始化的時候就做好
回復

使用道具 舉報

地板
ID:370824 發表于 2024-3-1 08:45 | 只看該作者
1. 200ms擦除時間不需要mcu一直干預,執行完擦除指令,就退出來。2. 通訊采用中斷模式,若硬件有獨立自緩存區可以使用查詢模式,不會影響與上位機通訊。
回復

使用道具 舉報

5#
ID:636806 發表于 2024-3-1 10:19 | 只看該作者
1、提前擦除扇區;2、實在避免不了擦除的時間,就先將數據緩存下來,擦除完成后再將緩存數據寫入
回復

使用道具 舉報

6#
ID:1104941 發表于 2024-3-1 14:01 | 只看該作者
臭獅子 發表于 2024-3-1 10:19
1、提前擦除扇區;2、實在避免不了擦除的時間,就先將數據緩存下來,擦除完成后再將緩存數據寫入

好的,目前參照這個做著
回復

使用道具 舉報

7#
ID:1104941 發表于 2024-3-1 14:03 | 只看該作者
yzw846562238 發表于 2024-3-1 08:43
1、如果單片機有dma功能,則用dma接收串口數據
2、25Q32看能不能用狀態機編程,刪除指令發出后不死等,等 ...

受教了,因為收到串口命令有涉及計算操作,感覺DMA不能用。狀態機編程我看下好不好實現
回復

使用道具 舉報

8#
ID:1111904 發表于 2024-3-1 14:04 | 只看該作者
執行完擦除指令后,讀取狀態寄存器,判斷是否擦除完成,然后再進行寫入數據
回復

使用道具 舉報

9#
ID:1104941 發表于 2024-3-1 14:09 | 只看該作者
JACKRENYONG 發表于 2024-3-1 08:45
1. 200ms擦除時間不需要mcu一直干預,執行完擦除指令,就退出來。2. 通訊采用中斷模式,若硬件有獨立自緩存 ...

/**
  * @brief  等待WIP(BUSY)標志被置0,即等待到FLASH內部數據寫入完畢
  * @param  none
  * @retval none
  */
void SPI_FLASH_WaitForWriteEnd(void)
{
  u8 FLASH_Status = 0;

  /* 選擇 FLASH: CS 低 */
  SPI_FLASH_CS_LOW();

  /* 發送 讀狀態寄存器 命令 */
  SPI_FLASH_SendByte(W25X_ReadStatusReg);

  /* 若FLASH忙碌,則等待 */
  do
  {
                /* 讀取FLASH芯片的狀態寄存器 */
    FLASH_Status = SPI_FLASH_SendByte(Dummy_Byte);         
  }
  while ((FLASH_Status & WIP_Flag) == SET);  /* 正在寫入標志 */

  /* 停止信號  FLASH: CS 高 */
  SPI_FLASH_CS_HIGH();
}
這個是我25Q32擦除后等待擦除完畢的函數,沒有試過不等待直接退出的。我測試一下。
采用中斷的話,我擔心正在寫入數據時,串口中斷來了,寫進去的數據異常。
回復

使用道具 舉報

10#
ID:401564 發表于 2024-3-1 15:42 | 只看該作者
這個實際上是你程序的問題,就算是死等,中斷也不全影響到W25Q32的寫入的,它對最慢時鐘是沒有要求的,一秒鐘一個時鐘都可以
這可能是你中斷中有改變W25Q32的操作,這才會影響到的
回復

使用道具 舉報

11#
ID:1104941 發表于 2024-3-2 09:29 | 只看該作者
Y_G_G 發表于 2024-3-1 15:42
這個實際上是你程序的問題,就算是死等,中斷也不全影響到W25Q32的寫入的,它對最慢時鐘是沒有要求的,一秒鐘一 ...

謝謝你的解疑,可以請教一下嗎?
1.W25Q32在寫過程中,來了中斷會影響保存的數據嗎?(中斷沒有操作25Q32)
2.目前中斷確實有操作25Q32的代碼,主循環每隔一段時間存儲數據,串口中斷收到對應命令,有操作25Q32。
目前是先等操作完再回應上位機,我擔心不在中斷中操作25Q32,先回應上位機再操作25Q32的話,馬上又有中斷來,還是會影響。
回復

使用道具 舉報

12#
ID:401564 發表于 2024-3-2 11:47 | 只看該作者
bstljq 發表于 2024-3-2 09:29
謝謝你的解疑,可以請教一下嗎?
1.W25Q32在寫過程中,來了中斷會影響保存的數據嗎?(中斷沒有操作25Q3 ...

1,中斷不會影響W25Q32的操作,不管是時鐘低電平時觸發中斷還是字節只寫了一半,中斷都不會影響的
2,如果是中斷中要有對W25Q32的操作,正確的作法是設置一個標志位,每次中斷只觸發標志位,但不能直接對W25Q32進行操作
在主函數中檢測標志位,等到上一次W25Q32操作完成之后,再進行操作,在子函數中清除標志位
上位機操作一般就是這樣的,單片機檢測到上位機的命令之后,不直接操作的,先標志一個標志位,再在主函數中檢測標志位,然后在對應的函數中清除標志位
回復

使用道具 舉報

13#
ID:1104941 發表于 2024-3-2 18:58 | 只看該作者
Y_G_G 發表于 2024-3-2 11:47
1,中斷不會影響W25Q32的操作,不管是時鐘低電平時觸發中斷還是字節只寫了一半,中斷都不會影響的
2,如果是 ...

謝謝了,按照你的思路有改善。
目前有個難以理解的問題,我現在是在25Q32取出一片區域,這個區域分成N塊,每塊寫入256字節。每次寫之前讀取該塊的前8個字節,計算8字節累加和判斷是不是0XFF來確認是否已經擦除了。
現在的現象是,如果是上電使用整片擦除,后續存儲數據讀出來的8字節都沒問題,驗證都通過。
如果我是在單個扇區擦除,然后讀出8字節,就會檢驗失敗。一個扇區里面有16個256字節的數據塊,起碼2個以上都是校驗失敗的,其他的的校驗成功。
扇區擦除加了讀BUSY狀態等待,而且后續還加了50MS軟件延遲,還是會出現問題。
回復

使用道具 舉報

14#
ID:1104941 發表于 2024-3-2 18:59 | 只看該作者
Y_G_G 發表于 2024-3-2 11:47
1,中斷不會影響W25Q32的操作,不管是時鐘低電平時觸發中斷還是字節只寫了一半,中斷都不會影響的
2,如果是 ...

/**
  * @brief  擦除FLASH扇區
  * @param  SectorAddr:要擦除的扇區地址[24位地址,但是芯片會忽略掉低12位地址]
  * @retval 無
  */
void SPI_FLASH_SectorErase(u32 SectorAddr)
{
//        #ifdef DEBUG_PRINTF
//        printf("erase addr %x\r\n",SectorAddr);
//        #endif
  /* 發送FLASH寫使能命令 */
  SPI_FLASH_WriteEnable();
  SPI_FLASH_WaitForWriteEnd();
  /* 擦除扇區 */
  /* 選擇FLASH: CS低電平 */
  SPI_FLASH_CS_LOW();
  /* 發送扇區擦除指令*/
  SPI_FLASH_SendByte(W25X_SectorErase);
  /*發送擦除扇區地址的高位*/
  SPI_FLASH_SendByte((SectorAddr & 0xFF0000) >> 16);
  /* 發送擦除扇區地址的中位 */
  SPI_FLASH_SendByte((SectorAddr & 0xFF00) >> 8);
  /* 發送擦除扇區地址的低位 */
  SPI_FLASH_SendByte(SectorAddr & 0xFF);
  /* 停止信號 FLASH: CS 高電平 */
  SPI_FLASH_CS_HIGH();
  /* 等待擦除完畢*/
  SPI_FLASH_WaitForWriteEnd();
}

/**
  * @brief  擦除FLASH扇區,整片擦除
        * 描述  :25Q32擦除一次要7-8秒
  * @param  無
  * @retval 無
  */
void SPI_FLASH_BulkErase(void)
{
  /* 發送FLASH寫使能命令 */
  SPI_FLASH_WriteEnable();

  /* 整塊 Erase */
  /* 選擇FLASH: CS低電平 */
  SPI_FLASH_CS_LOW();
  /* 發送整塊擦除指令*/
  SPI_FLASH_SendByte(W25X_ChipErase);
  /* 停止信號 FLASH: CS 高電平 */
  SPI_FLASH_CS_HIGH();

  /* 等待擦除完畢*/
  SPI_FLASH_WaitForWriteEnd();
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线欧美a| 精品国产乱码一区二区三区a | 日韩伦理一区二区三区 | 337p日本欧洲亚洲大胆鲁鲁 | 欧美一区二区三区在线 | 国产成人99久久亚洲综合精品 | 韩日在线视频 | 超碰在线人人 | 美女一级毛片 | 久久av网站 | 欧美久久一级特黄毛片 | 99精品久久久 | 欧美一级黄 | 美女久久视频 | 91精品中文字幕一区二区三区 | 欧美性猛交一区二区三区精品 | 国产精品一区二区在线播放 | 欧美日韩亚洲视频 | 草草草久久久 | 亚洲电影在线播放 | 国户精品久久久久久久久久久不卡 | 欧美 日韩 国产 在线 | 中文字幕精品一区 | 精品久久久久久久 | 91网站在线看 | a久久久久久 | 亚洲一区二区中文字幕 | 色网在线播放 | 成人在线免费视频 | 黄免费观看视频 | 久久国产日韩欧美 | 999精品视频在线观看 | 一区二区三区日韩精品 | 91av在线免费播放 | 婷婷久久综合 | 国产精品视频久久久 | 成人精品视频在线观看 | a网站在线观看 | 欧美一级在线 | 国产精品久久久久一区二区三区 | www亚洲成人|