中级会员
 
- 积分
- 212
- 金钱
- 212
- 注册时间
- 2016-7-28
- 在线时间
- 25 小时
|
5金钱
学了原子哥的SPI实验后,想发挥一下用GPIO模拟SPI来操作Flash.
可是模拟的读写函数 u8 SPI_RWByte(u8 TxData) 出了问题
SPI.H文件
#ifndef __SPI_H
#define __SPI_H
#include "sys.h"
#define MOSI_H GPIO_SetBits(GPIOB,GPIO_Pin_15)
#define MOSI_L GPIO_ResetBits(GPIOB,GPIO_Pin_15)
#define READ_MISO GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)
#define SCK_H GPIO_SetBits(GPIOB,GPIO_Pin_13)
#define SCK_L GPIO_ResetBits(GPIOB,GPIO_Pin_13)
void SPI2_Init(void);
u8 SPI_RWByte(u8 TxData);
#endif
SPI.C文件
#include "spi.h"
#include "delay.h"
void SPI2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
u8 SPI1_RWByte(u8 TxData)
{
u8 i;
for(i=0;i<8;i++)
{
if(TxData & 0x80)
MOSI_H;
else
MOSI_L;
TxData = (TxData << 1);
SCK_H; //上升沿写入
delay_us(2); //稳定数据
if(READ_MISO)
TxData |= 0x01;
SCK_L; //下降沿读出
delay_us(2); //稳定数据
}
return TxData;
}
u8 SPI2_RWByte(u8 TxData)
{
u8 i;
for(i=0;i<8;i++)
{
if(TxData & 0x80)
MOSI_H;
else
MOSI_L;
TxData = (TxData << 1);
SCK_L; //下降沿写入
delay_us(2); //稳定数据
if(READ_MISO)
TxData |= 0x01;
SCK_H; //上升沿读出
delay_us(2); //稳定数据
}
return TxData;
}
我把 u8 SPI1_RWByte(u8 TxData)配置成 SCK_H; 上升沿写入 SCK_L; 下降沿读出 时可以正常操作Flash的读写
我把 u8 SPI2_RWByte(u8 TxData)配置成SCK_L; 下降沿写入 SCK_H; 上升沿读出 时也可以正常操作Flash的读写
这是为什么?
|
-
时序图
|