ansontao 发表于 2012-11-13 03:03:07

关于STM32的SPI发送的问题 【悬赏问答】

其实提问很简单。就是一个spi的发送的问题。
我用spi写flash,具体的spi发送函数如下。


u8 SPIx_ReadWriteByte(u8 data)
{
      u8 retry=0;      
      /* Loop while DR register in not emplty */
      //while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
      while (SPI1->SR & SPI_I2S_FLAG_TXE == RESET)
      {
            retry++;
            if(retry>200)return 0;
      }
//      SPI_I2S_SendData(SPI1,data);//дÈëÒª·¢Ë͵ÄÊý¾Ý
      SPI1->DR = data;
      /* Wait to receive a byte */
      //while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)   //¼ì²éÖ¸¶¨µÄSPI±ê־λÉèÖÃÓë·ñ:½ÓÊÜ»º´æ·Ç¿Õ±ê־λ
      retry = 0;
      while( SPI1->SR & SPI_I2S_FLAG_RXNE == RESET )
      {
            retry++;
            if(retry>200)return 0;
      }
                /* Return the byte read from the SPI bus */
      return(uint16_t)SPI1->DR; //SPI_I2S_ReceiveData(SPI1);    //·µ»ØÍ¨¹ýSPIx×î½ü½ÓÊÕµÄÊý¾Ý      

      //**********µÈ´ý½ÓÊռĴæÆ÷¾ÍÊÕµ½Êý¾Ý*******************
}
把最后的return语句改成 return SPI1->DR; 总是写不了flash,总是卡住。但是改成SPI_I2S_ReceiveData(SPI1);就可以读写了。
但是SPI_I2S_ReceiveData(SPI1);里面的实现也是 return SPIx->DR啊,为什么会有这样的差别。

xiaodc88 发表于 2012-11-13 08:41:49

RE:关于STM32的SPI发送的问题

SPI_I2S_ReceiveData(SPI1);里面不可能只有SPIx->DR吧,仔细看看里面有其它语句影响不

xiaodc88 发表于 2012-11-13 08:42:41

RE:关于STM32的SPI发送的问题

实在没什么语句影响的,你稍延时下再返回试试

发表于 2012-11-13 09:48:36

RE:关于STM32的SPI发送的问题

现读取,后返回。
a= SPI1->DR;
return a;
u8 SPIx_ReadWriteByte 这个和返回的不相符。

ansontao 发表于 2012-11-13 12:19:02

回复:关于STM32的SPI发送的问题

回复第 4 楼 于2012-11-13 09:48:36发表:
现读取,后返回。
a= SPI1->DR;
return a;
u8 SPIx_ReadWriteByte 这个和返回的不相符。
 
Re:刚刚试了下你的方法还是不行。 还有我用的是IAR。不是用的MDK
 

ansontao 发表于 2012-11-13 12:23:24

RE:关于STM32的SPI发送的问题

u8 SPIx_ReadWriteByte(u8 data)
{
      u8 retry=0;       
      /* Loop while DR register in not emplty */
        //while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //¼ì²éÖ¸¶¨µÄSPI±ê־λÉèÖÃÓë·ñ:·¢ËÍ»º´æ¿Õ±ê־λ
      while (SPI1->SR & SPI_I2S_FLAG_TXE == RESET)
      {
          retry++;
          if(retry>200)return 0;
      }
//        SPI_I2S_SendData(SPI1,data);//дÈëÒª·¢Ë͵ÄÊý¾Ý
      SPI1->DR = data;
      /* Wait to receive a byte */
      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) {//改用库函数。
          //retry = 0;
      //while( SPI1->SR & SPI_I2S_FLAG_RXNE == RESET ) { //原来的操作寄存器
         
          retry++;
          if(retry>200)return 0;
      }
                /* Return the byte read from the SPI bus */
      //u8 a;
      //a = SPI1->DR;
        returnSPI1->DR; //SPI_I2S_ReceiveData(SPI1); //·µ»ØÍ¨¹ýSPIx×î½ü½ÓÊÕµÄÊý¾Ý       
}
后来我又改了一点代码,发现就可以直接return SPI1->DR了。就是把之前判断接收缓冲器为空用库函数实现,然后就可以了。为什么:L

ansontao 发表于 2012-11-13 12:24:12

RE:关于STM32的SPI发送的问题

怎么避免乱码?我从IAR复制的代码就会出现乱码!

xieyuanfu 发表于 2012-11-17 13:07:14

RE:关于STM32的SPI发送的问题

你单步执行一下 看看你的代码 是不是没有执行到后面那个return呢?

zykzyk-93033 发表于 2012-11-19 22:25:51

RE:关于STM32的SPI发送的问题 【悬赏问答】

把那个加个括号试试。:D

cjq_enjoy-15073 发表于 2012-11-27 12:48:37

RE:关于STM32的SPI发送的问题 【悬赏问答】

给个例子自己看看
页: [1]
查看完整版本: 关于STM32的SPI发送的问题 【悬赏问答】