STM32L152普通I/O模拟SPI驱动W25Q16不成功

2019-07-14 14:55发布


宏定义:
#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,但总也不成功,大神能不能帮忙看一下,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
yanxl0028
1楼-- · 2019-07-15 21:43
 精彩回答 2  元偷偷看……
yanxl0028
2楼-- · 2019-07-16 00:57
xieweibin 发表于 2018-12-28 12:06
建议楼主使用示波器检查一下,
看看波形是否正常。
能否读取Flash的ID。

感谢版主及工程
yanxl0028
3楼-- · 2019-07-16 02:55
60user36 发表于 2018-12-28 12:22
本帖最后由 stm1024 于 2018-3-26 11:28 编辑

单独看这两个函数似乎并没有问题,不过就W25Q16和您交流一下,确认你是否详细看过datasheet。

感谢版主经验分享
yanxl0028
4楼-- · 2019-07-16 05:01
60user36 发表于 2018-12-28 12:22
本帖最后由 stm1024 于 2018-3-26 11:28 编辑

单独看这两个函数似乎并没有问题,不过就W25Q16和您交流一下,确认你是否详细看过datasheet。

读取W25Q16芯片ID时,MISO一直是高电平,请问版主什么什么原因?W25Q16芯片没有问题,用其他板子测试是好的
xieweibin
5楼-- · 2019-07-16 08:04
andyseu 发表于 1970-1-1 08:00

很正常,MISO平时就是高阻的。
估计是你的IO配置不正确,或者硬件有问题。
yanxl0028
6楼-- · 2019-07-16 10:37
 精彩回答 2  元偷偷看……

一周热门 更多>