stm32f10x单片机进阶--spi使用
? 使用SPI與外部flash(MX25L6406EM21)IC通信
- 連接方式
? ? ? ? ? ? ? ? ??
?
? ? ? ? ?
? ? ? ? ? ? ? ? ? 如上圖所示,MCU通過SPI2與外部flash芯片進行相連接。
- MCU?spi2初始化
? ? ? ? ? ? ? ??
定義SPI2?中所使用的SPI?端口號
? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ?spi2中?通信功能初始化
讀數(shù)據(jù)與寫數(shù)據(jù)
- ? 指令說明
? ? ? ?查看flash芯片的datasheet,mx25芯片支持按照頁來寫,按照扇區(qū)來擦除。page_program?為 0x02? ? ,sector_erase為0x20。并且在向每個頁中寫數(shù)據(jù)前,必須先保證此頁所在的扇區(qū)已經(jīng)進行擦除操作。并且每一頁最大寫256byte ,一個扇區(qū)的大小為4Kbyte
- 寫數(shù)據(jù),按照頁來寫數(shù)據(jù)(寫一頁數(shù)據(jù))
依據(jù)芯片寫指令 0x06
void spi_flash_write_page(uint8_t* pBuffer,uint32_t write_address,uint16_t num_byte_to_write) //向頁中寫入數(shù)據(jù),其中write_address必須為256的整數(shù)據(jù)部,即一頁的開始位置, {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(); }- 擦除扇區(qū)
- 在指定地址處開始寫入指定長度的數(shù)據(jù)
從指定地址,寫入指定長度數(shù)據(jù)。也是從一個扇區(qū)的開始處進行寫,計算出一共需要寫入多少頁,同時如果為一個扇區(qū)的開始處,記得需要進行扇區(qū)擦除操作。
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 ++;} }- 讀數(shù)據(jù)
讀數(shù)據(jù)相對于寫數(shù)據(jù)來說,顯得比較簡單的多,從指定地址開始讀,讀取指定的長度
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();}至此整個驅(qū)動編寫完成。
轉(zhuǎn)載于:https://www.cnblogs.com/oops-374565452/p/8416663.html
總結(jié)
以上是生活随笔為你收集整理的stm32f10x单片机进阶--spi使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LR-IE录制设置
- 下一篇: 腾讯云云机安装dockers