本帖最后由 小黑黑兔子乖乖 于 2013-12-26 14:15 编辑
大家好,最近我在用stm32 的IO口模拟AT93C66的读写时序,但是有个一问题纠结我好久了,请高手指教!
就是每次我在写完之后延迟好长时间,才能进行读操作,否侧就不好用!大家看下面是AT93C66的写时序,当DO线一出现busy信号时,我的程序就需要等待几ms后,才可以进行读操作,如果不加这几ms的延时,就不好用!可是我看网上其他人是不用加延时的,有没有高手指教啊?如果加上这段延时,也就是我每写一个字就要延时,速度是很慢的啊!
我的程序大家也帮忙看看!
#define CS0 GPIOA->BSRRH=GPIO_Pin_4
#define CS1 GPIOA->BSRRL=GPIO_Pin_4
#define SK0 GPIOA->BSRRH=GPIO_Pin_5
#define SK1 GPIOA->BSRRL=GPIO_Pin_5
#define DI (GPIOA->IDR&GPIO_Pin_6)
#define DO0 GPIOA->BSRRH=GPIO_Pin_7
#define DO1 GPIOA->BSRRL=GPIO_Pin_7
#define READ_D 0xc000 //读指令
#define WRITE_D 0xa000 //写指令
#define ERASE_D 0xe000 //擦除指令
#define EWEN_D 0x9800 //擦/写允许指令
#define EW_D 0x8000 //擦/写禁止指令
//时钟函数
void at93c46_clock(void)
{
SK0;
Delay(100);
SK1;
Delay(100);
}
//输入函数;in_data为数据,d_bit为输入数据的位数。
void send(u16 in_data,u16 d_bit)
{
u8 i;
for(i=0;i<d_bit;i++)
{
if(in_data&0x8000)
{
DO1;
}
else
{
DO0;
}
in_data<<=1;
at93c46_clock();
}
}
//接收函数
u16 receive(void)
{
u16 in_data=0;
u8 j;
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)==1)
at93c46_clock();
for(j=0;j<16;j++)
{
at93c46_clock();
in_data<<=1;
if(DI)
{
in_data|=0x01;
}
}
at93c46_clock();
return(in_data);
}
//发送读指令和地址,从AT93C66指定的地址中读取数据
u16 read(u16 addr)
{
u16 data_r;
CS1;
send(READ_D,3); //送读指令
send(addr,8); //送地址
data_r=receive(); //接收数据
CS0;
return(data_r);
}
//擦除操作函数
void erase(u16 addr)
{
Delay(100);
CS1;
Delay(100);
send(ERASE_D,3);
send(addr,8);
CS0;
Delay(200);
CS1;
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)==1);
Delay(100);
CS0;
Delay(100);
}
//将一个字节数据写入AT93C66指定的地址中。
void write(u16 addr,u16 eData)
{
CS1; //擦/写允许
Delay(100);
send(EWEN_D,16);
send(0x01,2);
CS0;
Delay(100);
CS1;
send(WRITE_D,3); //送写指令
send(addr,8); //送地址
send(eData,16);
CS0;
at93c46_clock();
CS1;
at93c46_clock();
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)==1) at93c46_clock(); //等待写完
CS0;
}
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
write(0x5500,0x123);
Delay(50000);就是这个延时我必须要加上,要不程序就不好用,请高手帮忙看看
SPI1_RX_Buff[0]=read(0x5500);
Delay(100);
}
|