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

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 评论16 发布时间:2018-3-24 18:33

举报

16个回答
七哥 回答时间: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, 下载次数: 232)

评分

参与人数 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。

感谢版主及工程
oceane 回答时间:2018-3-26 14:41:50
stm1024 发表于 2018-3-26 11:23
单独看这两个函数似乎并没有问题,不过就W25Q16和您交流一下,确认你是否详细看过datasheet。
0.建议先试着 ...

感谢版主经验分享
oceane 回答时间:2018-3-26 18:23:18
stm1024 发表于 2018-3-26 11:23
单独看这两个函数似乎并没有问题,不过就W25Q16和您交流一下,确认你是否详细看过datasheet。
0.建议先试着 ...

读取W25Q16芯片ID时,MISO一直是高电平,请问版主什么什么原因?W25Q16芯片没有问题,用其他板子测试是好的
无薪税绵 回答时间:2018-3-27 09:55:53
oceane 发表于 2018-3-26 18:23
读取W25Q16芯片ID时,MISO一直是高电平,请问版主什么什么原因?W25Q16芯片没有问题,用其他板子测试是好 ...

很正常,MISO平时就是高阻的。
估计是你的IO配置不正确,或者硬件有问题。

评分

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

查看全部评分

oceane 回答时间:2018-3-29 12:41:19
问题解决,感谢各位帮助及回复,自己记录一下:
void SPI_Delay(void)
{
  uint16_t cnt = 5;

  while(cnt--);
}

void W25Q16_SPI_WriteByte(uint8_t TXData)
        {
                uint8_t cnt;
                for(cnt=0; cnt<8; cnt++)
                {
                        W25Q16_SPI_SCKLOW;
                        SPI_Delay();
                        if(TXData & 0x80)
                                W25Q16_SPI_MOSIHIGH;
                        else
                          W25Q16_SPI_MOSILOW;
                        TXData <<= 1;
                        SPI_Delay();
                        W25Q16_SPI_SCKHIGH;
                        SPI_Delay();
         }
        }
uint8_t W25Q16_SPI_ReadByte(void)
        {
                uint8_t cnt;
                uint8_t RxData = 0;
                for(cnt=0; cnt<8; cnt++)
                {
                        W25Q16_SPI_SCKLOW;
                  SPI_Delay();
                        RxData <<= 1;
                        if(W25Q16_MISO_READ)
                        {
                                RxData |= 0x01;
                        }
                        SPI_Delay();
                        W25Q16_SPI_SCKHIGH;
                        SPI_Delay();
                }
                return RxData;
        }

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3 结帖奖励

查看全部评分

@羁绊(‧‧)nnn 回答时间:2018-8-5 17:58:14
感谢楼主分享!
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版