模拟spi接口,可是只能写或者读

我在编写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; I
    C_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);}
    ————————————————
    版权声明:本文为优快云博主「奋怒的紫苑」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_39021487/article/details/107246428

问题已经解决,出在了读函数中的n=strlen((const char*)d);,数组作为形参,不能求出长度来,改为函数入口直接求数组长度如sizeof(d),并作为形参,就可以解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值