这些是SPI3模式下的初始化代码:
/************************************************
函数功能:SPI端口初始化(内部调用)
参数:无
返回:无
备注:SPI3_SCK->
C10 复用功能、推挽带下拉、50M响应速度
SPI3_MISO->
C11
同上
SPI3_MOSI->
C12
同上
SPI_CS-> PC9
推挽普通输出,不带,50M
*************************************************/
static void SPI_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//开时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC ,ENABLE);
//配置恢复缺省
GPIO_StructInit(&GPIO_InitStructure);
/******配置SPI三个控制端*********/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//端口映射
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SPI3);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SPI3);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SPI3);
/******配置使能端***************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT ;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/************************************************
函数功能:模式初始化(内部调用)
参数:无
返回:无
备注:无
*************************************************/
static void SPI_Mode_Configuration(void)
{
SPI_InitTypeDef SPI_InitStructure;
//开时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
//
SPI_I2S_DeInit(SPI3);
//全双工
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
//8位数据模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
//空闲模式下SCK为0
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
//数据采样从第1个时间边沿开始
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
//NSS软件管理
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
//波特率
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
//大端模式
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
//CRC多项式
SPI_InitStructure.SPI_CRCPolynomial = 7;
//主机模式
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_Init(SPI3, &SPI_InitStructure);
//使能
SPI_Cmd(SPI3, ENABLE);
}
/************************************************
函数功能:SPI初始化(外部调用)
参数:无
返回:无
备注:无
*************************************************/
void SPI_InitSet(void)
{
SPI_GPIO_Configuration();
SPI_Mode_Configuration();
}
/************************************************
函数功能:向SPI设备写入一字节(内部调用)
参数:byte->一字节参数
返回:Temp->返回的一字节
备注:无
*************************************************/
static uint8_t SPI_Flash_SendByte(uint8_t byte)
{
//等待发送寄存器清空
while( SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE)==RESET);
//发送一字节数据
SPI_I2S_SendData(SPI3,byte);
//等待返回数据
while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_RXNE)==RESET);
//返回数据
return (uint8_t)SPI_I2S_ReceiveData(SPI3);
}
使用的芯片是
N25Q128
根据其描述:
其相应的代码应该如下:
/************************************************
函数功能:读N25Q的器件ID(外部调用)
参数:无
返回:Temp->ID
备注:读ID有以下几点信息:
1、制造商ID,由JEDEC规定为->0x20
2、器件ID包含两部分:内存型号->0xba
内存容量->0x18
3、器件唯一ID包含只读的17字节:
数据长度->0x10
两字节的扩展ID
剩下的14字节全为0x00
4、读ID时序:先拉低CS,接着8位指令
*************************************************/
uint32_t SPI_Flash_ReadDeviceID(void)
{
uint32_t Temp;
//拉低CS,使能N25Q
N25Q_ENABLE;
//发送读ID指令
Temp=SPI_Flash_SendByte(N25Q_ReadID);
Temp<<=8;
Temp|=SPI_Flash_SendByte(0xff);
Temp<<=8;
Temp|=SPI_Flash_SendByte(0xff);
//
SPI_I2S_SendData(SPI3,N25Q_ReadID);
//返回数据
//
Temp=SPI_I2S_ReceiveData(SPI3);
//
Temp<<=8;
//
//返回数据
//
Temp|=SPI_I2S_ReceiveData(SPI3);
//
Temp<<=8;
//
//返回数据
//
Temp|=(uint8_t)SPI_I2S_ReceiveData(SPI3);
//拉高CS,失能N25Q
N25Q_DISABLE;
//返回ID
return Temp;
}
但是目前读出的ID都是:
0x00ffffff
请大家帮我分析一下原因,谢谢!
一周热门 更多>