| 
 
| 本帖最后由 小黑黑兔子乖乖 于 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);
 
 }
 
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册 
  |