STM32L152普通I/O模拟SPI驱动W25Q16问题
本帖最后由 oceane 于 2018-3-29 11:58 编辑宏定义:
#defineW25Q16_MISO_PIN(GPIO_Pin_4)
#defineW25Q16_MOSI_PIN(GPIO_Pin_5)
#defineW25Q16_SCK_PIN(GPIO_Pin_3)
#defineW25Q16_CS_PIN(GPIO_Pin_2)
#defineW25Q16_PORT(GPIOE)
#defineW25Q16_CLK(RCC_AHBPeriph_GPIOE)
#defineW25Q16_SPI_MOSIHIGH(GPIO_SetBits(W25Q16_PORT,W25Q16_MOSI_PIN))
#defineW25Q16_SPI_MOSILOW (GPIO_ResetBits(W25Q16_PORT,W25Q16_MOSI_PIN))
#defineW25Q16_SPI_SCKHIGH(GPIO_SetBits(W25Q16_PORT,W25Q16_SCK_PIN))
#defineW25Q16_SPI_SCKLOW (GPIO_ResetBits(W25Q16_PORT,W25Q16_SCK_PIN))
#define W25Q16_SPI_CSHIGH(GPIO_SetBits(W25Q16_PORT,W25Q16_CS_PIN))
#defineW25Q16_SPI_CSLOW (GPIO_ResetBits(W25Q16_PORT,W25Q16_CS_PIN))
#defineW25Q16_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,但总也不成功,大神能不能帮忙看一下,谢谢!
先看一下W25Q16的手册。你上面提供的程序看不出毛病来。但是仅凭以上两个函数是肯定操作不了W25Q16的。 你这个模拟SPI充其量只是单工SPI通讯写W25Q16,并未见到读操作函数,操作W25Q16需要双工SIP,使用模拟SIP好像得不偿失。建议还是直接套用ST官方例程,少走弯路。 wenyangzeng 发表于 2018-3-24 22:13
你这个模拟SPI充其量只是单工SPI通讯写W25Q16,并未见到读操作函数,操作W25Q16需要双工SIP,使用模拟SIP好 ...
嗯谢谢版主。因硬件设计连接W25Q16连接芯片的是普通I/o口,只能用模拟SPI了 自己顶一下!哪位前辈做过类似项目,能不能发上来相关代码参考一下 都是用的硬件SPI,模拟的需要自己根据手册写逻辑,最好是结合示波器,看波形确定程序发送的数据格式是否正确。 建议楼主使用示波器检查一下,
看看波形是否正常。
能否读取Flash的ID。
付上实例工程:
本帖最后由 stm1024 于 2018-3-26 11:28 编辑
单独看这两个函数似乎并没有问题,不过就W25Q16和您交流一下,确认你是否详细看过datasheet。
0.建议先试着从W25Q16中读数据,暂时不要写数据,如果是全新的芯片,则可以使用指令0x90或0xAB读芯片的Device ID,检查代码是否OK。
1.需要注意一些指令,代码长度从1-6个不等,需要先提供几个Dummy Byte,并不是你给一个指令,他就返回一个你期待的返回值。所以那个读数据的函数,调用的顺序也很重要,看下表:
2.W25Q16在写之前,应该先按Block或者Sector擦除,不能按Page擦除,这点很重要,不然数据写不进去。
你再多读一下Datasheet,能避免很多坑。 安 发表于 2018-3-26 09:11
都是用的硬件SPI,模拟的需要自己根据手册写逻辑,最好是结合示波器,看波形确定程序发送的数据格式是否正 ...
感谢版主 无薪税绵 发表于 2018-3-26 11:18
建议楼主使用示波器检查一下,
看看波形是否正常。
能否读取Flash的ID。
感谢版主及工程
页:
[1]
2