霞字五行属什么| 有肝病的人吃什么好| 哈尔滨市长什么级别| 喜极而泣的意思是什么| 肝肿大是什么原因| 过度什么意思| 什么锅好| le是什么元素| 支气管肺炎吃什么药| 肝多发钙化灶什么意思| 梦见蜜蜂是什么预兆| 蕴字五行属什么| 去医院看肛门挂什么科| 肺栓塞的主要症状是什么| 银色的什么| 小孩检查微量元素挂什么科| 总掉头发是什么原因| 人流后吃什么好| 支气管炎吃什么药有效| 足跟痛挂什么科| 请问紫苏叶有什么功效| 什么时候洗头是最佳时间| 木兮是什么意思| 补充微量元素吃什么| 香肠炒什么好吃| 痛风该吃什么药好得快| 细胞学说揭示了什么| 电影下映是什么意思| 天天都需要你爱是什么歌| 涵五行属什么| 麦高芬是什么意思| 一是什么动物| 地面铺什么最环保| 头大脸大适合什么发型| 喝什么中药补肾| 梦见游泳是什么预兆| 太平间是什么意思| 甲钴胺是治什么病的| 腰肌劳损用什么药最好| art是什么意思| 天津有什么好吃的| 奢侈的近义词是什么| 蛮什么意思| 肉鸽是什么意思| 子宫肌瘤是什么原因造成的| 什么叫水印| 桌游是什么| instagram是什么| 皮肤黑穿什么颜色的衣服显白| 戊肝阳性是什么意思| 吃杨梅有什么好处和功效| 中途疲软吃什么药| 闹心是什么意思啊| 养狗的人容易得什么病| 心什么神什么| 女性私处为什么会变黑| 吃什么可以补精子| 肝功能2项是指什么| 臭屁什么意思| 肠胃不好吃什么药好| 女性内分泌失调有什么症状| 什么东西最刮油减肥| 哥哥的孩子叫什么| 冬瓜和什么不能一起吃| 什么是签注| tiamo是什么意思| 曼龙鱼能和什么鱼混养| 什么的风雨| 黑色碳素笔是什么笔| 什么意思啊| 肾动脉狭窄有什么症状| 缅铃是什么| 成年人改名字需要什么手续| 代谢慢吃什么效果最快| 绿幽灵五行属什么| 大麦茶有什么功效与作用| 油炸食品用什么油最好| 幽门螺旋杆菌有什么症状| 10月24日什么星座| 结石什么原因引起的| 脑筋急转弯什么东西越洗越脏| 孤僻是什么意思| mic是什么| 寡欲是什么意思| 碘伏和络合碘有什么区别| 糖尿病人吃什么水果最好| 禄位是什么意思| 真心话大冒险问什么| 后背沉重感是什么原因引起的| 胃热口干口苦口臭吃什么药好| 山药叶子长什么样图片| 鼻窦炎吃什么抗生素| 椰子水有什么功效| 腱鞘炎是什么原因引起的| 查电解质是查什么| 血月代表什么| 女人晚上盗汗是什么原因| 猫不能吃什么东西| 自采暖是什么意思| 立是什么意思| 手指关节痛吃什么药好| 性激素六项是什么| 皮蛋为什么含铅| 宫颈ecc是什么意思| 蜂蜜水什么时间喝最好| 喝茶叶有什么好处| 国际劳动日是什么生肖| 角头是什么意思| 阑尾炎看什么科室| 吴刚和嫦娥什么关系| 疏导是什么意思| 白带正常是什么样子| 飞机杯什么意思| 糖尿病是什么原因引起的| 条件反射是什么意思| 心脏瓣膜关闭不全吃什么药| 经常爱放屁是什么原因| 吃什么预防脑梗| 吃盐吃多了有什么危害| 荨麻疹什么症状| 车厘子是什么季节的| 待我长发及腰时下一句是什么| 结肠多发憩室是什么意思| 看不起是什么意思| 软化血管吃什么药| 哪吒是一个什么样的人| 本家是什么意思| 山西属于什么地区| 半枝莲有什么功效| 耳朵后面是什么穴位| gj是什么意思| 鸿雁是什么意思| 湿漉漉是什么意思| 吲达帕胺片是什么药| 无缘是什么意思| 1962年属什么| strange什么意思| 阴虚内热吃什么药| 咽喉疱疹是什么症状| 败血症是什么| 坐围和臀围有什么区别| 空腹打嗝是什么原因引起的| 腋臭看什么科| apc是什么意思| 肚脐眼下面是什么部位| 胃黏膜病变是什么意思| 黄芪喝多了有什么副作用| 什么万| 什么血型最好| 愚公移山是什么意思| 梦见自己出嫁是什么意思| 血分析能查出什么| 4月15日是什么日子| 女用避孕套是什么样的| 辩证思维是什么意思| 门槛什么意思| 什么的小狗| 为什么说肺结核是穷人病| 一度是什么意思| 耳后长痣代表什么意思| 有口臭是什么原因引起的| 敌敌畏是什么| 头发软化和拉直有什么区别| 胃出血大便是什么颜色| 白茶有什么功效| 米干是什么| 肠胃炎可以吃什么食物| 邓紫棋为什么叫gem| 反酸是什么意思| 什么狗不掉毛适合家养| 诸葛亮是个什么样的人| 七零年属什么生肖| m型发际线适合什么发型| 下身瘙痒用什么药| 属鸡的和什么属相最配| 六月十二日是什么日子| 秦王是什么生肖| 植物神经紊乱看什么科| 揽子是什么意思| 肠镜检查前需要做什么准备工作| 吃什么补充维生素d| 古着店是什么意思| 睚眦是什么意思| pp材质是什么材料| 医院面试一般会问什么| 徐州有什么好吃的美食| 什么叫做红颜知己| 志心皈命礼是什么意思| 56年属什么生肖| 人体缺甲是什么症状| 枭印什么意思| 血尿是什么颜色| 掉头发是什么原因引起的| 杭州五行属什么| 大便秘结是什么意思| 老头乐是什么| 女人白带多是什么原因| 干什么呢| asc是什么意思| 倒闭是什么意思| 男生爱出汗是什么原因| 屁股出血是什么原因| 肺纤维灶是什么意思| 可拉明又叫什么| 秀才指什么生肖| 吃什么对肺部好| 9月是什么星座| 尿频挂什么科| 山东立冬吃什么| 不耐受和过敏有什么区别| 治鸡眼用什么药最好| 邮箱是什么| 京东自营店是什么意思| 当归是什么| 白葡萄酒配什么食物| 山药为什么煮熟了也麻口| 白细胞低什么原因| 胃痛吃什么药最有效| 挂急诊和门诊有什么区别| 伽是什么意思| 脉冲什么意思| 三尖瓣反流是什么意思| 成林香是什么意思| 血脂查什么项目| 头疼喝什么饮料| 为什么会血热| 木须是什么| 9月出生的是什么星座| 太阳穴凹陷是什么原因| 黑色碳素笔是什么笔| 口臭吃什么药效果最好| 脸上长粉刺是什么原因引起的| 依托考昔片是什么药| 炎症用什么药最好| 睡觉流眼泪是什么原因| 为什么不能踩死蜈蚣| 办狗证需要什么资料| 感冒了吃什么饭菜合适| 不来月经有什么危害| 吃什么有饱腹感还减肥| 什么官许愿| lh是什么激素| ep什么意思| 621什么星座| 让我随你去让我随你去是什么歌| 老年人助听器什么牌子好| 钟馗是什么人物| 放线菌是什么| 自带bgm是什么意思| 3月26日是什么节日| TOYOTA是什么车| 生不逢时是什么意思| 一什么雨| 假正经是什么意思| 女人喜欢什么样的阴茎| 黄油是什么油| 膀胱炎吃什么药最见效| kr是什么货币| 鬼针草有什么作用| 办港澳通行证需要带什么| 红颜知己是什么意思| 借您吉言什么意思| 吃什么油对身体好| ip指的是什么| 百度
打印
[单片机芯片]

机关党委是干什么的

[复制链接]
477|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这次来玩一下CH32V307 SPI接口通信
一、SPI是什么
1、SPI介绍
SPI(Serial Peripheral Interface,串行外设接口)是一种由摩托罗拉公司开发的??同步串行通信协议??,专用于短距离设备间的数据交换。它通过??主从模式??工作:一个主设备(如CH32V307)控制时钟并发起通信,一个或多个从设备(如传感器、存储器)响应指令。其核心特点是??全双工通信??(可同时收发数据)与??高速传输??(可达50MHz)
2、工作原理
SPI仅需4根物理连线实现全双工通信:
信号线
作用

?
?方向?
?SCLK?
主设备输出的同步时钟(速率可配置)
主→从
?MOSI?
主设备发送数据,从设备接收(Master-Out-Slave-In)
主→从
?MISO?
从设备发送数据,主设备接收(Master-In-Slave-Out)
从→主
?CS/SS?
片选信号(低电平激活从设备)
主→从

数据传输原理??:
主从设备内置??移位寄存器??,连接成环形结构。时钟驱动下:
  • 主设备通过MOSI逐位移出数据(如0xAA: 1→0→1→0→1→0→1→0)
  • 从设备通过MISO同步移出数据
  • 8个时钟周期完成1字节交换,形成“数据循环”

SPI通过 ??CPOL(时钟极性)?? 和 ??CPHA(时钟相位)?? 定义四种模式,决定??数据采样时机??
3、优缺点
优点
缺点
速率远超I2C(可达50MHz)
?无硬件应答?:无法自动确认数据接收成功
?全双工通信?:同时收发数据
?引脚占用多?:每增加一个从机需多1根片选线
?硬件简单?:无需上拉电阻,功耗低
?传输距离短?:通常<1米(易受干扰)
?无地址冲突?:通过CS引脚直接选从机
?无标准协议?:不同厂商实现可能不兼容
?灵活数据长度?:支持8/16/32位传输
?单主设备限制:无法多主机协同

二、SPI读写W25Q16测试
1、简单介绍一下W25Q16芯片
W25Q16是一个16M BIT的FLASH芯片,它有8192个可编程页,一个能够写入256个字节;页擦除一次性可以擦除4K/32K/64KB或者整个芯片;分别有512个可擦除扇区,32个可擦除扇区。
它的组成是总共有32个块,每个块有64KB,一个块又分为16个扇区。使用它可以做大容量数据存储。

2、SPI相关引脚初始化


3、SPI初始化
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI3, &SPI_InitStructure);

    SPI_Cmd(SPI3, ENABLE);


4、SPI发送函数
/*********************************************************************
* @fn      SPI3_ReadWriteByte
*
* [url=home.php?mod=space&uid=247401]@brief[/url]   SPI3 read or write one byte.
*
* @param   TxData - write one byte data.
*
* [url=home.php?mod=space&uid=266161]@return[/url]  Read one byte data.
*/
u8 SPI3_ReadWriteByte(u8 TxData)
{
    while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);

    SPI_I2S_SendData(SPI3, TxData);

    while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET);

    return SPI_I2S_ReceiveData(SPI3);
}


5、读写FLASH函数
/*********************************************************************
* @fn      SPI_Flash_ReadSR
*
* @brief   Read W25Qxx status register.
*        !!BIT7  6   5   4   3   2   1   0
*        !!SPR   RV  TB  BP2 BP1 BP0 WEL BUSY
*
* @return  byte - status register value.
*/
u8 SPI_Flash_ReadSR(void)
{
    u8 byte = 0;

    FLASH_CS_LOW;
    SPI3_ReadWriteByte(W25X_ReadStatusReg);
    byte = SPI3_ReadWriteByte(0Xff);
    FLASH_CS_HIGH;

    return byte;
}

/*********************************************************************
* @fn      SPI_FLASH_Write_SR
*
* @brief   Write W25Qxx status register.
*
* @param   sr - status register value.
*
* @return  none
*/
void SPI_FLASH_Write_SR(u8 sr)
{
    FLASH_CS_LOW;
    SPI3_ReadWriteByte(W25X_WriteStatusReg);
    SPI3_ReadWriteByte(sr);
    FLASH_CS_HIGH;
}

/*********************************************************************
* @fn      SPI_Flash_Wait_Busy
*
* @brief   Wait flash free.
*
* @return  none
*/
void SPI_Flash_Wait_Busy(void)
{
    while((SPI_Flash_ReadSR() & 0x01) == 0x01)
        ;
}

/*********************************************************************
* @fn      SPI_FLASH_Write_Enable
*
* @brief   Enable flash write.
*
* @return  none
*/
void SPI_FLASH_Write_Enable(void)
{
    FLASH_CS_LOW;
    SPI3_ReadWriteByte(W25X_WriteEnable);
    FLASH_CS_HIGH;
}

/*********************************************************************
* @fn      SPI_FLASH_Write_Disable
*
* @brief   Disable flash write.
*
* @return  none
*/
void SPI_FLASH_Write_Disable(void)
{
    FLASH_CS_LOW;
    SPI3_ReadWriteByte(W25X_WriteDisable);
    FLASH_CS_HIGH;
}

/*********************************************************************
* @fn      SPI_Flash_ReadID
*
* @brief   Read flash ID.
*
* @return  Temp - FLASH ID.
*/
u16 SPI_Flash_ReadID(void)
{
    u16 Temp = 0;

    FLASH_CS_LOW;
    SPI3_ReadWriteByte(W25X_ManufactDeviceID);
    SPI3_ReadWriteByte(0x00);
    SPI3_ReadWriteByte(0x00);
    SPI3_ReadWriteByte(0x00);
    Temp |= SPI3_ReadWriteByte(0xFF) << 8;
    Temp |= SPI3_ReadWriteByte(0xFF);
    FLASH_CS_HIGH;

    return Temp;
}

/*********************************************************************
* @fn      SPI_Flash_Erase_Sector
*
* @brief   Erase one sector(4Kbyte).
*
* @param   Dst_Addr - 0 !! 2047
*
* @return  none
*/
void SPI_Flash_Erase_Sector(u32 Dst_Addr)
{
    Dst_Addr *= 4096;
    SPI_FLASH_Write_Enable();
    SPI_Flash_Wait_Busy();
    FLASH_CS_LOW;
    SPI3_ReadWriteByte(W25X_SectorErase);
    SPI3_ReadWriteByte((u8)((Dst_Addr) >> 16));
    SPI3_ReadWriteByte((u8)((Dst_Addr) >> 8));
    SPI3_ReadWriteByte((u8)Dst_Addr);
    FLASH_CS_HIGH;
    SPI_Flash_Wait_Busy();
}

/*********************************************************************
* @fn      SPI_Flash_Read
*
* @brief   Read data from flash.
*
* @param   pBuffer -
*          ReadAddr -Initial address(24bit).
*          size - Data length.
*
* @return  none
*/
void SPI_Flash_Read(u8 *pBuffer, u32 ReadAddr, u16 size)
{
    u16 i;

    FLASH_CS_LOW;
    SPI3_ReadWriteByte(W25X_ReadData);
    SPI3_ReadWriteByte((u8)((ReadAddr) >> 16));
    SPI3_ReadWriteByte((u8)((ReadAddr) >> 8));
    SPI3_ReadWriteByte((u8)ReadAddr);

    for(i = 0; i < size; i++)
    {
        pBuffer[i] = SPI3_ReadWriteByte(0XFF);
    }

    FLASH_CS_HIGH;
}

/*********************************************************************
* @fn      SPI_Flash_Write_Page
*
* @brief   Write data by one page.
*
* @param   pBuffer -
*          WriteAddr - Initial address(24bit).
*          size - Data length.
*
* @return  none
*/
void SPI_Flash_Write_Page(u8 *pBuffer, u32 WriteAddr, u16 size)
{
    u16 i;

    SPI_FLASH_Write_Enable();
    FLASH_CS_LOW;
    SPI3_ReadWriteByte(W25X_PageProgram);
    SPI3_ReadWriteByte((u8)((WriteAddr) >> 16));
    SPI3_ReadWriteByte((u8)((WriteAddr) >> 8));
    SPI3_ReadWriteByte((u8)WriteAddr);

    for(i = 0; i < size; i++)
    {
        SPI3_ReadWriteByte(pBuffer[i]);
    }

    FLASH_CS_HIGH;
    SPI_Flash_Wait_Busy();
}

/*********************************************************************
* @fn      SPI_Flash_Write_NoCheck
*
* @brief   Write data to flash.(need Erase)
*          All data in address rang is 0xFF.
*
* @param   pBuffer -
*          WriteAddr - Initial address(24bit).
*          size - Data length.
*
* @return  none
*/
void SPI_Flash_Write_NoCheck(u8 *pBuffer, u32 WriteAddr, u16 size)
{
    u16 pageremain;

    pageremain = 256 - WriteAddr % 256;

    if(size <= pageremain)
        pageremain = size;

    while(1)
    {
        SPI_Flash_Write_Page(pBuffer, WriteAddr, pageremain);

        if(size == pageremain)
        {
            break;
        }
        else
        {
            pBuffer += pageremain;
            WriteAddr += pageremain;
            size -= pageremain;

            if(size > 256)
                pageremain = 256;
            else
                pageremain = size;
        }
    }
}

/*********************************************************************
* @fn      SPI_Flash_Write
*
* @brief   Write data to flash.(no need Erase)
*
* @param   pBuffer -
*          WriteAddr - Initial address(24bit).
*          size - Data length.
*
* @return  none
*/
void SPI_Flash_Write(u8 *pBuffer, u32 WriteAddr, u16 size)
{
    u32 secpos;
    u16 secoff;
    u16 secremain;
    u16 i;

    secpos = WriteAddr / 4096;
    secoff = WriteAddr % 4096;
    secremain = 4096 - secoff;

    if(size <= secremain)
        secremain = size;

    while(1)
    {
        SPI_Flash_Read(SPI_FLASH_BUF, secpos * 4096, 4096);

        for(i = 0; i < secremain; i++)
        {
            if(SPI_FLASH_BUF[secoff + i] != 0XFF)
                break;
        }

        if(i < secremain)
        {
            SPI_Flash_Erase_Sector(secpos);

            for(i = 0; i < secremain; i++)
            {
                SPI_FLASH_BUF[i + secoff] = pBuffer[i];
            }

            SPI_Flash_Write_NoCheck(SPI_FLASH_BUF, secpos * 4096, 4096);
        }
        else
        {
            SPI_Flash_Write_NoCheck(pBuffer, WriteAddr, secremain);
        }

        if(size == secremain)
        {
            break;
        }
        else
        {
            secpos++;
            secoff = 0;

            pBuffer += secremain;
            WriteAddr += secremain;
            size -= secremain;

            if(size > 4096)
            {
                secremain = 4096;
            }
            else
            {
                secremain = size;
            }
        }
    }
}

/*********************************************************************
* @fn      SPI_Flash_Erase_Chip
*
* @brief   Erase all FLASH pages.
*
* @return  none
*/
void SPI_Flash_Erase_Chip(void)
{
    SPI_FLASH_Write_Enable();
    SPI_Flash_Wait_Busy();
    FLASH_CS_LOW;
    SPI3_ReadWriteByte(W25X_ChipErase);
    FLASH_CS_HIGH;
    SPI_Flash_Wait_Busy();
}

/*********************************************************************
* @fn      SPI_Flash_PowerDown
*
* @brief   Enter power down mode.
*
* @return  none
*/
void SPI_Flash_PowerDown(void)
{
    FLASH_CS_LOW;
    SPI3_ReadWriteByte(W25X_PowerDown);
    FLASH_CS_HIGH;
    Delay_Us(3);
}

/*********************************************************************
* @fn      SPI_Flash_WAKEUP
*
* @brief   Power down wake up.
*
* @return  none
*/
void SPI_Flash_WAKEUP(void)
{
    FLASH_CS_LOW;
    SPI3_ReadWriteByte(W25X_ReleasePowerDown);
    FLASH_CS_HIGH;
    Delay_Us(3);
}
     6、头文件
/* Winbond SPIFalsh ID */
#define W25Q80                   0XEF13
#define W25Q16                   0XEF14
#define W25Q32                   0XEF15
#define W25Q64                   0XEF16
#define W25Q128                  0XEF17

/* Winbond SPIFalsh Instruction List */
#define W25X_WriteEnable         0x06
#define W25X_WriteDisable        0x04
#define W25X_ReadStatusReg       0x05
#define W25X_WriteStatusReg      0x01
#define W25X_ReadData            0x03
#define W25X_FastReadData        0x0B
#define W25X_FastReadDual        0x3B
#define W25X_PageProgram         0x02
#define W25X_BlockErase          0xD8
#define W25X_SectorErase         0x20
#define W25X_ChipErase           0xC7
#define W25X_PowerDown           0xB9
#define W25X_ReleasePowerDown    0xAB
#define W25X_DeviceID            0xAB
#define W25X_ManufactDeviceID    0x90
#define W25X_JedecDeviceID       0x9F

#define FLASH_CS_HIGH GPIO_WriteBit(GPIOE, GPIO_Pin_6, 1)
#define FLASH_CS_LOW  GPIO_WriteBit(GPIOE, GPIO_Pin_6, 0)

u8 SPI1_ReadWriteByte(u8 TxData);
void SPI_Flash_Init(void);
u8 SPI_Flash_ReadSR(void);
void SPI_FLASH_Write_SR(u8 sr);
void SPI_Flash_Wait_Busy(void);
void SPI_FLASH_Write_Enable(void);
void SPI_FLASH_Write_Disable(void);
u16 SPI_Flash_ReadID(void);
void SPI_Flash_Erase_Sector(u32 Dst_Addr);
void SPI_Flash_Read(u8 *pBuffer, u32 ReadAddr, u16 size);
void SPI_Flash_Write_Page(u8 *pBuffer, u32 WriteAddr, u16 size);
void SPI_Flash_Write_NoCheck(u8 *pBuffer, u32 WriteAddr, u16 size);
void SPI_Flash_Write(u8 *pBuffer, u32 WriteAddr, u16 size);
void SPI_Flash_Erase_Chip(void);
void SPI_Flash_PowerDown(void);
void SPI_Flash_WAKEUP(void);
    7、主函数
/*********************************************************************
* @fn      main
*
* @brief   Main program.
*
* @return  none
*/
int main(void)
{
        u8  readData[SIZE];
    u16 Flash_Model;
    u8 writeData[SIZE] = {0};
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        SystemCoreClockUpdate();
        Delay_Init();
        USART_Printf_Init(115200);       
        printf("SystemClk:%d\r\n",SystemCoreClock);
        printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
        printf("This is printf example\r\n");
           SPI_Flash_Init();

    Flash_Model = SPI_Flash_ReadID();
    for(uint16_t i = 0;i < SIZE;i++) {
        writeData[i] = i;
    }

    switch(Flash_Model)
    {
        case W25Q80:
            printf("W25Q80 OK!\r\n");

            break;

        case W25Q16:
            printf("W25Q16 OK!\r\n");

            break;

        case W25Q32:
            printf("W25Q32 OK!\r\n");

            break;

        case W25Q64:
            printf("W25Q64 OK!\r\n");

            break;

        case W25Q128:
            printf("W25Q128 OK!\r\n");

            break;

        default:
            printf("Fail!\r\n");

            break;
    }
    printf("Start Erase W25Qxx....\r\n");
    SPI_Flash_Erase_Sector(0);
    printf("W25Qxx Erase Finished!\r\n");

    Delay_Ms(500);
    printf("Start Read W25Qxx....\r\n");
    SPI_Flash_Read(readData, 0x0, SIZE);
    printf("read OK\r\n");

    Delay_Ms(500);
    printf("Start Write W25Qxx....\r\n");
    printf("W25Qxx Write Finished!\r\n");
    for(uint8_t i = 0;i < SIZE;i++) {
        printf("%d ",writeData[i]);
        if (i % 50 == 0) {
            printf("\r\n");
        }
    }
    SPI_Flash_Write((u8 *)writeData, 0, SIZE);

   

    Delay_Ms(500);
    printf("Start Read W25Qxx....\r\n");
    SPI_Flash_Read(readData, 0x0, SIZE);
    printf("read OK\r\n");
    for(uint8_t i = 0;i < SIZE;i++) {
        printf("%d ",readData[i]);
        if (i % 50 == 0) {
            printf("\r\n");
        }
    }
   

    Delay_Ms(500);
    printf("Start erase chip....\r\n");
    SPI_Flash_Erase_Chip();
    printf("chip erased finsh\r\n");

    printf("Start Read W25Qxx....\r\n");
    SPI_Flash_Read(readData, 0x0, SIZE);
    printf("%s\r\n", readData);

        while(1)
    {

        }
}
     8、下载验证
主要做了以下测试,擦除扇区、读写数据、擦除整个芯片,擦除整个芯片耗时6ms,这速度擦除还是可以的




沙发
丙丁先生| | 2025-8-1 22:10 | 只看该作者
板子照片?
板凳
丙丁先生| | 2025-8-1 22:11 | 只看该作者
沁恒CH32V307开发板 有两种
地板
蚊子的噩梦| | 2025-8-2 13:13 | 只看该作者
这篇测评很详细,特别是SPI接口的工作原理和优缺点分析,让我对SPI有了更深的理解。
5
星享社|  楼主 | 2025-8-2 16:51 | 只看该作者
丙丁先生 发表于 2025-8-1 22:11
沁恒CH32V307开发板 有两种

板子照片就没有拍了,用的是沁恒CH32V307VCT6-EVT-R2开发板
6
星享社|  楼主 | 2025-8-2 16:51 | 只看该作者
蚊子的噩梦 发表于 2025-8-2 13:13
这篇测评很详细,特别是SPI接口的工作原理和优缺点分析,让我对SPI有了更深的理解。
...

多谢大佬鼓励
7
丙丁先生| | 2025-8-3 19:44 | 只看该作者
星享社 发表于 2025-8-2 16:51
板子照片就没有拍了,用的是沁恒CH32V307VCT6-EVT-R2开发板

感谢回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

19

帖子

0

粉丝
7月27号是什么星座 tcl什么牌子 蟑螂吃什么 为什么养猫就没有蟑螂 熊猫尾巴什么颜色
9点半是什么时辰 小腿红肿是什么原因引起的 这个季节适合种什么菜 什么是妈宝男 红烧肉是什么菜系
土的行业有什么工作 富丽堂皇是什么意思 食道好像有东西堵着是什么原因 右肩膀和胳膊疼痛是什么原因 毳毛是什么
如火如荼是什么意思 同房后小腹痛什么原因 肚子左边是什么部位 国企混改是什么意思 冒菜和麻辣烫有什么区别
肿瘤切开了里面是什么hcv7jop6ns8r.cn 新生儿打嗝是什么原因hcv8jop8ns5r.cn 八字缺什么怎么算baiqunet.com 笼中鸟是什么意思imcecn.com 冬瓜有什么功效和作用sscsqa.com
联名款是什么意思hcv9jop0ns0r.cn 为什么尿液一直是黄的hcv8jop8ns1r.cn 世子是什么意思hcv8jop1ns9r.cn 邓紫棋和华晨宇什么关系hcv8jop1ns8r.cn 一九七二年属什么生肖hcv7jop6ns8r.cn
手抖是什么原因hcv8jop5ns8r.cn 爬山是什么意思hcv9jop5ns7r.cn 三月五号是什么星座hcv9jop1ns6r.cn 手串断了寓意什么hcv8jop7ns0r.cn vmax什么意思hcv9jop0ns0r.cn
副团级是什么军衔hcv9jop4ns4r.cn 鱼吐泡泡是什么原因hcv8jop2ns1r.cn 百香果有什么好处功效hcv7jop9ns3r.cn 右手有痣代表什么hcv8jop6ns9r.cn 人的脾脏起什么作用hcv8jop8ns1r.cn
百度