打印
[STM32F1]

AT45DB041模拟SPI

[复制链接]
694|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yang1106|  楼主 | 2018-3-27 12:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在编写32f103与at45db041读写程序时,采用模拟spi接口,可是只能写或者读,也就是用82命令写后,马上用03命令读,读出的数据全为零。可是写之后,把写命令屏蔽掉,只用读命令,读出的数据是对的。不知道有什么问题?

#define SPI_CS_LOW       (GPIOA->BRR |=GPIO_Pin_5)
#define SPI_CS_HIGH      (GPIOA->BSRR |=GPIO_Pin_5)
#define SPI_SCK_LOW      (GPIOA->BRR |=GPIO_Pin_6)
#define SPI_SCK_HIGH     (GPIOA->BSRR |=GPIO_Pin_6)
#define SPI_MISO_LOW     (GPIOA->BRR |=GPIO_Pin_4)
#define SPI_MISO_HIGH    (GPIOA->BSRR|=GPIO_Pin_4)
#define SPI_MISO_READ    (GPIOA->IDR &GPIO_Pin_4)
#define SPI_MOSI_LOW     (GPIOA->BRR |=GPIO_Pin_7)
#define SPI_MOSI_HIGH    (GPIOA->BSRR|=GPIO_Pin_7)

void Init_45DB041(void)
{
    GPIO_InitTypeDef  GPIO_InitStruct;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
     //CS
     GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
     GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;
     GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
     GPIO_Init(GPIOA, &GPIO_InitStruct);
     //SCK
     GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
     GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
     GPIO_Init(GPIOA,&GPIO_InitStruct);
     //MISO
     GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;
     GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//加上拉电阻,其它没加
    GPIO_Init(GPIOA,&GPIO_InitStruct);
     //MOSI
     GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
     GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
     GPIO_Init(GPIOA,&GPIO_InitStruct);  
     SPI_CS_HIGH;
     SPI_SCK_HIGH;
}

void read_arry_byte(unsigned long address,unsigned char *d)//Á¬Ðø×Ö½Ú¶Á
{  
unsigned char j=0,k=0,n;
__disable_irq();
n=strlen((const char*)d);//ÇóÊýÁ¿

SPI_SCK_HIGH;
delay_us(100);
SPI_CS_LOW;
//SPI_MISO_HIGH;
delay_us(100);

for(k=0;k<32;k++)//ËÍÃüÁî
{
   SPI_SCK_LOW;
   delay_us(100);
   if((address&0x80000000)==0x80000000)
   { SPI_MOSI_HIGH;}
   else
   { SPI_MOSI_LOW;}
   delay_us(100);
   SPI_SCK_HIGH;
   address<<=1;
   delay_us(100);
}
//SPI_SCK_HIGH;
//delay_us(100);
for(j=0;j<n;j++)//¶ÁÊý¾Ý
{
   for(k=0;k<8;k++)
   {
    d[j]<<=1;
    SPI_SCK_LOW;
    delay_us(100);
    if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4))
    {d[j]|=0x01;}
    else
    {d[j]&=0xFE;}
    SPI_SCK_HIGH;
    delay_us(100);
   }
}
   SPI_CS_HIGH;
   SPI_SCK_LOW;
   delay_us(100);
}

void write_page(unsigned long address,unsigned char *data)//Á¬Ðø×Ö½Úд
{
unsigned char j=0,k=0,n;
__disable_irq();
n=strlen((const char*)data);//ÇóÊýÁ¿

SPI_SCK_HIGH;
delay_us(100);
SPI_CS_LOW;
delay_us(100);

for(k=0;k<32;k++)//ËÍÃüÁî
{
   SPI_SCK_LOW;
   delay_us(100);
   if((address&0x80000000)==0x80000000)
   { SPI_MOSI_HIGH;}
   else
   { SPI_MOSI_LOW;}
   delay_us(100);
   SPI_SCK_HIGH;
   address<<=1;
   delay_us(100);
}
// SPI_SCK_HIGH;
// delay_us(100);
for(j=0;j<n;j++)//ËÍÊý¾Ý
{
   for(k=0;k<8;k++)
   {
    SPI_SCK_LOW;
    delay_us(100);
     if((data[j]&0x80)==0x80)
      { SPI_MOSI_HIGH;}
     else
      { SPI_MOSI_LOW;}
    delay_us(100);
    SPI_SCK_HIGH;
    data[j]<<=1;
    delay_us(100);
   }
}
SPI_CS_HIGH;
SPI_SCK_LOW;
delay_us(100);
}

unsigned char Read_state(void)
{
unsigned char k=0,i=0xD7;
__disable_irq();

SPI_SCK_HIGH;
delay_us(100);
SPI_CS_LOW;
// SPI_MISO_HIGH;
delay_us(100);

for(k=0;k<8;k++)//ËÍÃüÁî
{
   SPI_SCK_LOW;
   delay_us(100);
   if((i&0x80)==0x80)
   { SPI_MOSI_HIGH;}
   else
   { SPI_MOSI_LOW;}
   delay_us(100);
   SPI_SCK_HIGH;
   i<<=1;
   delay_us(100);
}
i=0;
// SPI_SCK_HIGH;
// delay_us(100);
for(k=0;k<8;k++)//¶ÁÊý¾Ý
   {
    i<<=1;
    SPI_SCK_LOW;
    delay_us(100);
    if(SPI_MISO_READ)
    {i|=0x01;}
    else
    {i&=0xFE;}
    SPI_SCK_HIGH;
    delay_us(100);
   }
SPI_CS_HIGH;
SPI_SCK_LOW;
delay_us(100);
return i;
}

void erase_45(void)
{
unsigned char j=0,i=0;
unsigned char erease_order[4]={0xc7,0x94,0x80,0x9a};//²Á³ýÃüÁî
   __disable_irq();

SPI_SCK_HIGH;
delay_us(100);
SPI_CS_LOW;
delay_us(100);
while(j<4)
{
    for(i=0;i<8;i++)
   {
    SPI_SCK_LOW;
    delay_us(100);
    if((erease_order[j]&0x80)==0x80)
    { SPI_MOSI_HIGH;}
    else
    { SPI_MOSI_LOW; }
    delay_us(100);
    SPI_SCK_HIGH;
    erease_order[j]<<=1;
    delay_us(100);
   }
   j++;
}
SPI_CS_HIGH;
SPI_SCK_LOW;
delay_us(100);
}

void  main()
{
   u8 IC_Serial[4];//´æ´¢IC¿¨ÐòÁкÅ
u8 IC_ID[4];//¶ÁÈ¡IC¶Á¿¨Æ÷É豸IDºÅ
Init_45DB041();
IC_Serial[0]=0xDD;IC_Serial[1]=0xFF;IC_Serial[2]=0xFD;IC_Serial[3]=0xDD;
   write_page(0x82000800,IC_Serial);
delay_ms(500);delay_ms(500);delay_ms(500);delay_ms(500); delay_ms(500);//
while((Read_state()&0x80)==0) delay_ms(5);
__enable_irq();
read_arry_byte(0x03000800,IC_ID);
__enable_irq();
   sprintf((char*)p,"DC32(20,120,'%X-%X-%X-%X',15);\r\n",IC_ID[0],IC_ID[1],IC_ID[2],IC_ID[3]);//
    atk_8266_send_cmd(p,"OK",200);

}


沙发
yang1106|  楼主 | 2018-3-27 13:03 | 只看该作者
现在发现一个 问题,写之后,调用读程序,时序都不对拉

使用特权

评论回复
板凳
yang1106|  楼主 | 2018-3-29 11:11 | 只看该作者
问题已经解决,出在了读函数中的n=strlen((const char*)d);,数组作为形参,不能求出长度来,改为函数入口直接求数组长度如sizeof(d),并作为形参,就可以解决问题。

使用特权

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

本版积分规则

2

主题

7

帖子

0

粉丝