|
求大神指点,一下是相关的程序代码,读ID读到的全是0xFFFFFF,读其他的内存地址也是ff,不只是哪里出了故障,还请大神们帮助分析分析:
#define CE_Low() GPIO_ResetBits(GPIOC,GPIO_Pin_12); //PB12/SPI2NSS 选中片选使能
#define CE_High() GPIO_SetBits(GPIOC,GPIO_Pin_12); //PB12/SPI2NSS 片选失能
#define ENABLE_WP() GPIO_ResetBits(GPIOC,GPIO_Pin_11); // PB11/WP 低电平写保护
#define DISABLE_WP() GPIO_SetBits(GPIOC,GPIO_Pin_11); // PB11/WP 低电平写保护
/*
****************************************************************************
*函数名称:void SPIInit(void)
*函数功能:初始化SPI
*入口参数:
*出口参数:无
*日期:2013 12 10
*版本:V1.0
*作者:yrj
****************************************************************************
*/
//PB11/WP PB12/SPI2NSS PB13/SPI2CLK PB14/SPI2MISO PB15/SPI2MOSI
void SPIInit(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
//PB14 (MISO)浮空输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//PB15 MOSI PB13 SCK 复用推挽输出(外设总线用)
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//PB12 NSS,PB11 WP写保护普通推挽输出 本实验用软件控制NSS(主从设备的选择控制端)
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
CE_High();//失能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);//SPI1与SPI2的时钟频率源不同
SPI_InitTypeDef SPI_InitStructure;
SPI_I2S_DeInit(SPI2);
SPI_Cmd(SPI2,DISABLE);//在改变CPOL/CPHA位之前必须清除SPE位将SPI禁止
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//双线全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//主模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//时钟悬空低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获与第1个时钟沿
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//软件控制NSS信号
SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_8;//比特率预分频值为8。最大18MHz
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//高位在前
SPI_InitStructure.SPI_CRCPolynomial = 7;//定义用于CRC值计算的多项式 7
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Cmd(SPI2,ENABLE);
////////////// SST 写保护初始化
//// [WP=0;BPL=1 NOT Allowed] ;[WP=0;BPL=0 Allowed];[WP=1;BPL=x Allowed]
//// 进入保护状态 begin
CE_Low();
Send_Byte(0x06); // 写使能
CE_High();
//////
CE_Low();
Send_Byte(0x50); // 使能写状态寄存器
CE_High();
///////
DISABLE_WP() ; // 拉高 低电平写保护
CE_Low();
Send_Byte(0x01); // 写状态寄存器
Send_Byte(0x9C); //写状态寄存器使芯片全区保护状态寄存器:BPL AAI BP3 BP2 BP1 BP0 WEL BUSY
CE_High();
ENABLE_WP() ; // 置低 低电平写保护
//// 进入保护状态 end
}
////SPI读写数据函数
uint8 spi_write(uint8 data)
{
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2, data);//发送数据
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE)==RESET); //等待数据发送完毕
return SPI_I2S_ReceiveData(SPI2);
}
/************************************************************************
** 函数名称:SSTF016B_RdID
** 函数功能:SST25VF016B的读ID函数,可选择读ID和读数据操作
Jedec_ID:BFH 25H 41H 十进制为:12526913
************************************************************************/
uint8 SSTF016B_RdID(idtype IDType, uint32* RcvbufPt)
{
uint32 temp=0;
uint32 t[3]={0}; //测试用,用后即删
if (IDType == Jedec_ID)
{
CE_Low();
spi_write(0x9F); // 发送读JEDEC ID命令(9Fh),
temp = (temp | spi_write(0x00)) << 8;// 接收数据 字节1制造商ID BF
t[0]=temp; //测试用,返回第一字节
temp = (temp | spi_write(0x00)) << 8;// 接收数据 16位器件ID 字节2 25 字节3 41
t[1]=temp; //测试用,返回第2字节
temp = (temp | spi_write(0x00));
t[2]=temp; //测试用,返回第3字节
// 在本例中,temp的值应为0xBF2541 十进制:12526913
CE_High();
*RcvbufPt = temp;
return (OK);
}
}
void main(void)
{
SPIInit(); //SST的SPI总线初始化
SysDOInit(); //测试任务切换用 开关量输出管脚初始化
uint32 Rcvbuf[2]={0x00}; //测试读芯片ID用
while(1)
{
CtrlDOData(0x08); //用于指示任务是否运行的LED
SSTF016B_RdID(Jedec_ID, Rcvbuf); //读取芯片ID
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|