你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
ansontao 提问时间:2012-11-13 03:03 /
其实提问很简单。就是一个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啊,为什么会有这样的差别。

收藏 评论9 发布时间:2012-11-13 03:03

举报

9个回答
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;
        return  SPI1->DR; //SPI_I2S_ReceiveData(SPI1); //·µ»Øͨ¹ýSPIx×î½ü½ÓÊÕµÄÊý¾Ý       
}
后来我又改了一点代码,发现就可以直接return SPI1->DR了。就是把之前判断接收缓冲器为空用库函数实现,然后就可以了。  为什么
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发送的问题 【悬赏问答】

把那个加个括号试试。
cjq_enjoy-15073 回答时间:2012-11-27 12:48:37

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

给个例子自己看看

SPI FLASH 实验.rar

下载

4.11 MB, 下载次数: 116

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版