新手入门
- 积分
- 17
- 金钱
- 17
- 注册时间
- 2018-1-21
- 在线时间
- 1 小时
|
1金钱
STM32F103系列用io口模拟驱动不了w25q16,读取id为0xffff;
io口配置
void spi_init(void)
{
//端口时钟使能PA口
RCC->APB2ENR |=0X01<<2;
//配置成pa5,7推挽输出,50mhz;pb6--普通功能浮空输入
GPIOB->CRL &=~(0XFFF<<20);
GPIOB->CRL |= (0X343<<20);
SPI_SCK=1; //时钟信号线处于空闲电平--mode3
}
u8 spi_write_read(u8 data) //mode3
{
u8 i;
for(i=0;i<8;i++)
{
SPI_SCK=0;
if(data & 0x80) {SPI_MOSI=1;}
else { SPI_MOSI=0;}
SPI_SCK=1;
data =data<<1;
if(SPI_MISO) data |=0X01;
}
// SPI_SCK=0;
return data;
}
w25q16的初始化;
u8 w25q16_init(void)
{
//端口时钟使能PA口
RCC->APB2ENR |=0X01<<2;
//配置pa4为输出
GPIOB->CRL &=~(0X0F<<16);
GPIOB->CRL |= (0X03<<16);
//根据原理图,CS没有取反,应该等于0才是取消
W25Q16_CS=1; //取消片选
spi_init( );
//取消写保护
//write_enable();
return flash_read_id(0XEF14);
}
//读ID
u8 flash_read_id(u16 id)
{
u16 read_id=0;
W25Q16_CS=0;
spi_write_read( FLASH_READ_ID);
spi_write_read(0);
spi_write_read(0);
spi_write_read(0);
read_id |=((u16)spi_write_read(0xff))<<8;
read_id |=spi_write_read(0xff);
W25Q16_CS=1;
if(read_id==id)
{
return FLASH_NO_ERR;
}
return FLASH_ID_ERR;
}
原理图
|
最佳答案
查看完整内容[请看2#楼]
硬件spi:http://blog.csdn.net/qq_20553613/article/details/78998617
模拟spi:http://blog.csdn.net/qq_20553613/article/details/79060103
|