你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L152普通I/O模拟SPI驱动W25Q16问题

[复制链接]
oceane 提问时间:2018-3-24 18:33 /
悬赏5ST金币未解决
本帖最后由 oceane 于 2018-3-29 11:58 编辑

宏定义:
#define  W25Q16_MISO_PIN  (GPIO_Pin_4)

#define  W25Q16_MOSI_PIN  (GPIO_Pin_5)

#define  W25Q16_SCK_PIN  (GPIO_Pin_3)

#define  W25Q16_CS_PIN  (GPIO_Pin_2)

#define  W25Q16_PORT  (GPIOE)
#define  W25Q16_CLK  (RCC_AHBPeriph_GPIOE)

#define  W25Q16_SPI_MOSIHIGH  (GPIO_SetBits(W25Q16_PORT,W25Q16_MOSI_PIN))
#define  W25Q16_SPI_MOSILOW   (GPIO_ResetBits(W25Q16_PORT,W25Q16_MOSI_PIN))

#define  W25Q16_SPI_SCKHIGH  (GPIO_SetBits(W25Q16_PORT,W25Q16_SCK_PIN))
#define  W25Q16_SPI_SCKLOW   (GPIO_ResetBits(W25Q16_PORT,W25Q16_SCK_PIN))

#define   W25Q16_SPI_CSHIGH  (GPIO_SetBits(W25Q16_PORT,W25Q16_CS_PIN))
#define  W25Q16_SPI_CSLOW   (GPIO_ResetBits(W25Q16_PORT,W25Q16_CS_PIN))

#define  W25Q16_MISO_IN   (GPIO_ReadInputDataBit(W25Q16_PORT,W25Q16_MISO_PIN))



void W25Q16_SPI_init(void)  //I/O初始化
        {
                GPIO_InitTypeDef GPIO_InitStructure;
                RCC_AHBPeriphClockCmd(W25Q16_CLK,ENABLE);
               
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
                GPIO_InitStructure.GPIO_Pin=W25Q16_MISO_PIN;
                GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
                GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
                GPIO_Init(W25Q16_PORT,&GPIO_InitStructure);
        
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
                GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
                GPIO_InitStructure.GPIO_Pin= W25Q16_CS_PIN|W25Q16_SCK_PIN;
                GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
                GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
                GPIO_Init(W25Q16_PORT,&GPIO_InitStructure);
               
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
                GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
                GPIO_InitStructure.GPIO_Pin=W25Q16_MOSI_PIN;
                GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
                GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
                GPIO_Init(W25Q16_PORT,&GPIO_InitStructure);
        
                W25Q16_SPI_CSHIGH;
                W25Q16_SPI_MOSILOW;
                W25Q16_SPI_SCKLOW;
        }
unsigned char W25Q16_SPI_SendData(unsigned char Data)  
{  
  {
    unsigned char Out = 0;
    unsigned char i = 0;
    W25Q16_SPI_SCKLOW;
    for(i = 0; i < 8; i++)
    {
        if(Data & 0x80)W25Q16_SPI_MOSIHIGH;
        else W25Q16_SPI_MOSILOW;
        Data = Data << 1;
        __NOP();
        __NOP();
        __NOP();
        W25Q16_SPI_SCKHIGH;
        if(W25Q16_MISO_IN)Out |= 0x80 >> i;
        __NOP();
        __NOP();
        __NOP();
        W25Q16_SPI_SCKLOW;
    }
    W25Q16_SPI_SCKLOW;

    return Out;               
                }   
}
本人芯片为STM32L152系列芯片,用普通I/O模拟SPI驱动W25Q16,但总也不成功,大神能不能帮忙看一下,谢谢!

收藏 1 评论15 发布时间:2018-3-24 18:33

举报

15个回答
toofree 回答时间:2018-3-24 21:39:01
先看一下W25Q16的手册。你上面提供的程序看不出毛病来。但是仅凭以上两个函数是肯定操作不了W25Q16的。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wenyangzeng 回答时间:2018-3-24 22:13:08
你这个模拟SPI充其量只是单工SPI通讯写W25Q16,并未见到读操作函数,操作W25Q16需要双工SIP,使用模拟SIP好像得不偿失。建议还是直接套用ST官方例程,少走弯路。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

oceane 回答时间:2018-3-25 21:09:49
wenyangzeng 发表于 2018-3-24 22:13
你这个模拟SPI充其量只是单工SPI通讯写W25Q16,并未见到读操作函数,操作W25Q16需要双工SIP,使用模拟SIP好 ...

嗯  谢谢版主。因硬件设计连接W25Q16连接芯片的是普通I/o口,只能用模拟SPI了
oceane 回答时间:2018-3-26 08:34:44
自己顶一下!哪位前辈做过类似项目,能不能发上来相关代码参考一下
回答时间:2018-3-26 09:11:43
都是用的硬件SPI,模拟的需要自己根据手册写逻辑,最好是结合示波器,看波形确定程序发送的数据格式是否正确。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

无薪税绵 回答时间:2018-3-26 11:18:36
建议楼主使用示波器检查一下,
看看波形是否正常。
能否读取Flash的ID。

付上实例工程:
STM32F10x_SPI(软件模拟)读写Flash(25Q16).zip (311.21 KB, 下载次数: 225)

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

stm1024 回答时间:2018-3-26 11:23:17
本帖最后由 stm1024 于 2018-3-26 11:28 编辑

单独看这两个函数似乎并没有问题,不过就W25Q16和您交流一下,确认你是否详细看过datasheet。
0.建议先试着从W25Q16中读数据,暂时不要写数据,如果是全新的芯片,则可以使用指令0x90或0xAB读芯片的Device ID,检查代码是否OK。
1.需要注意一些指令,代码长度从1-6个不等,需要先提供几个Dummy Byte,并不是你给一个指令,他就返回一个你期待的返回值。所以那个读数据的函数,调用的顺序也很重要,看下表:
2018-03-26_112003.png

2.W25Q16在写之前,应该先按Block或者Sector擦除,不能按Page擦除,这点很重要,不然数据写不进去。

你再多读一下Datasheet,能避免很多坑。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

oceane 回答时间:2018-3-26 14:41:05
安 发表于 2018-3-26 09:11
都是用的硬件SPI,模拟的需要自己根据手册写逻辑,最好是结合示波器,看波形确定程序发送的数据格式是否正 ...

感谢版主
oceane 回答时间:2018-3-26 14:41:32
无薪税绵 发表于 2018-3-26 11:18
建议楼主使用示波器检查一下,
看看波形是否正常。
能否读取Flash的ID。

感谢版主及工程
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版