日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stm32f10x单片机进阶--spi使用

發布時間:2024/7/19 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32f10x单片机进阶--spi使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? 使用SPI與外部flash(MX25L6406EM21)IC通信

  • 連接方式

? ? ? ? ? ? ? ? ??

?

? ? ? ? ?

? ? ? ? ? ? ? ? ? 如上圖所示,MCU通過SPI2與外部flash芯片進行相連接。

  • MCU?spi2初始化

? ? ? ? ? ? ? ??

    定義SPI2?中所使用的SPI?端口號

? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ?spi2中?通信功能初始化

讀數據與寫數據

  • ? 指令說明

? ? ? ?查看flash芯片的datasheet,mx25芯片支持按照頁來寫,按照扇區來擦除。page_program?為 0x02? ? ,sector_erase為0x20。并且在向每個頁中寫數據前,必須先保證此頁所在的扇區已經進行擦除操作。并且每一頁最大寫256byte ,一個扇區的大小為4Kbyte

  • 寫數據,按照頁來寫數據(寫一頁數據)

依據芯片寫指令 0x06

void spi_flash_write_page(uint8_t* pBuffer,uint32_t write_address,uint16_t num_byte_to_write) //向頁中寫入數據,其中write_address必須為256的整數據部,即一頁的開始位置, {uint16_t i=0;// debug_out("SpiPage:0x%08x Len:%d\r\n", write_address, num_byte_to_write); spi_flash_wait_busy(); //忙等待spi_flash_write_enable();spi_flash_wait_busy();spi2_cs_low();spi2_read_write_byte(MX25_PAGE_PROGRAM);spi2_read_write_byte((uint8_t) ( ((write_address) >> 16 )&0xFF) );spi2_read_write_byte((uint8_t) ( ((write_address) >> 8 )&0xFF) );spi2_read_write_byte((uint8_t) ( (write_address)&0xff ) );for(i=0;i<num_byte_to_write;i++){spi2_read_write_byte(pBuffer[i]);}spi2_cs_high();spi_flash_wait_busy(); }
  • 擦除扇區
void spi_flash_erase_sector(uint32_t addr) //addr地起為4K的倍數,清除一個扇區 {spi_flash_wait_busy();spi_flash_write_enable();spi_flash_wait_busy();//??DD2á3y2ù×÷ spi2_cs_low();spi2_read_write_byte(MX25_SECTOR_ERASE);spi2_read_write_byte((uint8_t) ( ((addr) >> 16 )&0xFF) );spi2_read_write_byte((uint8_t) ( ((addr) >> 8 )&0xFF) );spi2_read_write_byte((uint8_t) ( (addr)&0xff ) );spi2_cs_high();spi_flash_wait_busy(); }
  • 在指定地址處開始寫入指定長度的數據

從指定地址,寫入指定長度數據。也是從一個扇區的開始處進行寫,計算出一共需要寫入多少頁,同時如果為一個扇區的開始處,記得需要進行扇區擦除操作。

void spi_flash_write(uint8_t* pBuffer,uint32_t address,uint16_t buffer_len) {uint16_t pageCount = 0;uint16_t pageIndex = 0;uint16_t length = 0;uint16_t i=0;pageCount = buffer_len / SPI_FLASH_PAGE_SIZE;if( ( buffer_len % SPI_FLASH_PAGE_SIZE ) != 0 ){pageCount += 1;}while( pageIndex < pageCount ){length = buffer_len - ( pageIndex * SPI_FLASH_PAGE_SIZE ) ;length = length > SPI_FLASH_PAGE_SIZE ? SPI_FLASH_PAGE_SIZE : length;if( ( ( address + pageIndex * SPI_FLASH_PAGE_SIZE ) % SPI_FLASH_SECTOR_SIZE ) == 0 ){spi_flash_erase_sector( address + pageIndex * SPI_FLASH_PAGE_SIZE );}spi_flash_write_page(pBuffer + pageIndex * SPI_FLASH_PAGE_SIZE, address + pageIndex * SPI_FLASH_PAGE_SIZE, length );pageIndex ++;} }
  • 讀數據

讀數據相對于寫數據來說,顯得比較簡單的多,從指定地址開始讀,讀取指定的長度

void spi_flash_read(uint8_t* pBuffer,uint32_t read_address,uint16_t num_byte_to_read) {uint16_t i=0;spi_flash_wait_busy();spi2_cs_low();spi2_read_write_byte(MX25_READ_DATA);spi2_read_write_byte((uint8_t) ( ((read_address) >> 16 )&0xFF) );spi2_read_write_byte((uint8_t) ( ((read_address) >> 8 )&0xFF) );spi2_read_write_byte((uint8_t) ( (read_address)&0xff ) );for(i=0;i<num_byte_to_read;i++){pBuffer[i]=spi2_read_write_byte(0xFF);}spi2_cs_high();}

至此整個驅動編寫完成。

轉載于:https://www.cnblogs.com/oops-374565452/p/8416663.html

總結

以上是生活随笔為你收集整理的stm32f10x单片机进阶--spi使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。