stm32f10x单片机进级

stm32f10x单片机进级

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

  • 连年情势

图片 1

图片 2

如上海体育地方所示,MCU通过SPI2与外表flash微芯片实行相连接。

  • MCUspi2初始化

图片 3

    定义SPI第22中学所使用的SPI端口号

图片 4

spi第22中学通信成效开始化

stm32f10x单片机进级–spi使用,stm32f10x–spi

读数据与写多少

  • 命令表达

翻看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 ( ((write_address) >> 16 )&0xFF) );    spi2_read_write_byte ( ((write_address) >> 8 )&0xFF) );    spi2_read_write_byte ( (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();        //½øÐвÁ³ý²Ù×÷    spi2_cs_low();    spi2_read_write_byte(MX25_SECTOR_ERASE);    spi2_read_write_byte  >> 16 )&0xFF) );    spi2_read_write_byte  >> 8 )&0xFF) );    spi2_read_write_byte &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 ( ((read_address) >> 16 )&0xFF) );    spi2_read_write_byte ( ((read_address) >> 8 )&0xFF) );    spi2_read_write_byte ( (read_address)&0xff ) );        for(i=0;i<num_byte_to_read;i++)    {        pBuffer[i]=spi2_read_write_byte(0xFF);    }        spi2_cs_high();    }

从那之后整个驱动编写成功。

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

  • 连日来格局

               
  图片 1

 

       
 图片 2

                  如上海图书馆所示,MCU通过SPI2与外界flash微电路举行相连接。

  • MCU spi2初始化

             
  图片 3

    定义SPI2 中所使用的SPI 端口号

                       
  图片 4

               spi第22中学 通讯成效早先化

网站地图xml地图