stm32f10x单片机进阶--spi使用
生活随笔
收集整理的這篇文章主要介紹了
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_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使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LR-IE录制设置
- 下一篇: Java基础11-封装(思想、访问权限、