初级会员

- 积分
- 177
- 金钱
- 177
- 注册时间
- 2020-4-2
- 在线时间
- 94 小时
|
50金钱
//在主函数中,读取数据一直为0,不知道问题出现在哪,没有头绪
//希望大佬能给点建议,帮忙找找错误,不胜感激
#include"eeprom.h"
void EEPROM_Init_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI3_Init;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOG,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
//配置SPI口
/*Configure SPI3--SCK,MOSI*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
/*Configure SPI3--MISO*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB,&GPIO_InitStructure);
/*Configure NSS of SPI3*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*configure EEPROM-CS*/
GPIO_InitStructure.GPIO_Pin = IO_EEPROM_CS; //芯片片选管脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(PORT_EEPROM_CS, &GPIO_InitStructure);
/*Configure EEPROM-WP*/
GPIO_InitStructure.GPIO_Pin = IO_EEPROM_WP; //芯片保护管脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(PORT_EEPROM_WP, &GPIO_InitStructure);
//配置SPI3
SPI3_Init.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//双向全双工
SPI3_Init.SPI_Mode = SPI_Mode_Master;
SPI3_Init.SPI_DataSize = SPI_DataSize_8b;
SPI3_Init.SPI_CPOL = SPI_CPOL_Low;
SPI3_Init.SPI_CPHA = SPI_CPHA_1Edge;
SPI3_Init.SPI_NSS = SPI_NSS_Soft;
SPI3_Init.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI3_Init.SPI_CRCPolynomial = 7;
SPI3_Init.SPI_FirstBit = SPI_FirstBit_MSB;//MSB开始传输
SPI_Init(SPI3, &SPI3_Init);
SPI_Cmd(SPI3, ENABLE);//使能SPI3
EEPROM_CS_H; //拉高片选
EEPROM_WP_CLOSE; //拉高保护管脚,关闭写保护
}
void EEPROM_Read(u16 romAddress,u8* ramAddress,u32 dataLength)
{
u32 i=0;
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_RXNE);
EEPROM_CS_L; //拉低片选管脚
SPI_I2S_SendData(SPI3,(u16)EEPROM_COMMAND_READ); //EEPROM_COMMAND_READ=3
while(!SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE));
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_RXNE);
SPI_I2S_SendData(SPI3,(0xFF & (romAddress>>8)));
while(!SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) || !SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE));
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_RXNE);
SPI_I2S_SendData(SPI3,(0xFF & romAddress));
while(!SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) || !SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE));
for(i=0;i<dataLength;i++)
{
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_RXNE);
SPI_I2S_SendData(SPI3,0xFF);
while(!SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) || !SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE));
ramAddress[i] = (u8)SPI_I2S_ReceiveData(SPI3);
}
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_RXNE);
EEPROM_CS_H; //拉高片选
}
void EEPROM_Write(u16 romAddress,u8* ramAddress,u32 dataLength)
{
u32 i=0;
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
EEPROM_CS_L; //拉低片选
EEPROM_WP_CLOSE; //拉高保护管脚
SPI_I2S_SendData(SPI3,(u16)EEPROM_COMMAND_WREN); //EEPROM_COMMAND_WREN=6
while(!SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE));
EEPROM_CS_H; //拉高片选
EEPROM_CS_L; //拉低片选
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
SPI_I2S_SendData(SPI3,(u16)EEPROM_COMMAND_WRITE); //EEPROM_COMMAND_WRITE=2
while(!SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE));
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
SPI_I2S_SendData(SPI3,(0xFF & (romAddress>>8)));
while(!SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE));
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
SPI_I2S_SendData(SPI3,(0xFF & romAddress));
while(!SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE));
for(i = 0 ; i < dataLength ; i++)
{
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
SPI_I2S_SendData(SPI3,ramAddress[i]);
while(!SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE));
}
SPI_I2S_ClearFlag(SPI3, SPI_I2S_FLAG_TXE);
EEPROM_CS_H; //拉高片选
// EEPROM_WP_OPEN; //拉低保护管脚
}
//主函数
#include<stm32f10x.h>
#include"eeprom.h"
u8 data[10]={1,2,3,4,5,6,7,8,9,10};
u8 temp[10]={0};
int main(void)
{
EEPROM_Init_Config();
EEPROM_Write(0x1000,data,10);
EEPROM_Read(0x1000,temp,10);
while(1);
}
|
最佳答案
查看完整内容[请看2#楼]
解决了 IO口PB3需要功能复用一下才能产生SPI时钟,同时程序中的while语句状态卡不住,需要重新按照手册SPI的接收发送来配置。。。。。
|