打印

关于E2PROM(AT93C66)读写程序问题

[复制链接]
3174|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 小黑黑兔子乖乖 于 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);

}

相关帖子

沙发
zhdefa| | 2013-12-26 16:39 | 只看该作者
学习学习

使用特权

评论回复
板凳
dirtwillfly| | 2013-12-26 21:31 | 只看该作者
写完之后要判断busy信号的吧

使用特权

评论回复
地板
tyw| | 2013-12-26 21:45 | 只看该作者
本帖最后由 tyw 于 2013-12-26 21:50 编辑

93C66系列写入周期是慢来西滴.

93C46系列/1K-16K Microwire 串行EEPROM.pdf (967.12 KB)



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

94

帖子

0

粉丝