本帖最后由 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,但总也不成功,大神能不能帮忙看一下,谢谢! |
STM32L151RDT6 SDIO读写SD卡 FIFO下溢错误,不知是什么原因
STM32L152 RTC唤醒STOP mode问题
STM32L152系列自带LCD驱动段码液晶屏,怎么驱动想要亮的段亮
STM32L151为何FLASH擦除后全是是0x00?
求助!!STM32L151中的RTC唤醒(wake up)中断问题
STM32L152开发板原理图及说明文档
STM32L1系列,如何释放PA15为普通GPIO端口
STM32L151读取W25Q16的ID错误,请帮忙看看是什么原因
STM32L151 STOP模式唤醒程序跑哪儿了
STM32L152驱动段码LCD问题?
评分
查看全部评分
评分
查看全部评分
嗯 谢谢版主。因硬件设计连接W25Q16连接芯片的是普通I/o口,只能用模拟SPI了
评分
查看全部评分
看看波形是否正常。
能否读取Flash的ID。
付上实例工程:
评分
查看全部评分
单独看这两个函数似乎并没有问题,不过就W25Q16和您交流一下,确认你是否详细看过datasheet。
0.建议先试着从W25Q16中读数据,暂时不要写数据,如果是全新的芯片,则可以使用指令0x90或0xAB读芯片的Device ID,检查代码是否OK。
1.需要注意一些指令,代码长度从1-6个不等,需要先提供几个Dummy Byte,并不是你给一个指令,他就返回一个你期待的返回值。所以那个读数据的函数,调用的顺序也很重要,看下表:
2.W25Q16在写之前,应该先按Block或者Sector擦除,不能按Page擦除,这点很重要,不然数据写不进去。
你再多读一下Datasheet,能避免很多坑。
评分
查看全部评分
感谢版主
感谢版主及工程
感谢版主经验分享
读取W25Q16芯片ID时,MISO一直是高电平,请问版主什么什么原因?W25Q16芯片没有问题,用其他板子测试是好的
很正常,MISO平时就是高阻的。
估计是你的IO配置不正确,或者硬件有问题。
评分
查看全部评分
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;
}
评分
查看全部评分