OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5803|回复: 3

关于SPI直接操作寄存器和用固件库的问题

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-3-12
在线时间
0 小时
发表于 2012-11-13 03:11:45 | 显示全部楼层 |阅读模式

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啊,为什么会有这样的差别。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-13 10:00:37 | 显示全部楼层
把retry 改为u16 类型,把200改为2000试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-3-12
在线时间
0 小时
 楼主| 发表于 2012-11-13 13:02:26 | 显示全部楼层
不是延时的问题。我把等待接收缓冲区非空用库函数实现。然后return SPI->DR就成功了。不知道是什么原因,我用的是IAR。

        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) {//?ì?é???¨??SPI±ê?????è????·?:????????·???±ê????
          //retry = 0;
//        while( SPI1->SR & SPI_I2S_FLAG_RXNE == RESET ) {
          
          retry++;
          if(retry>2000)return 0;
        }
        return  SPI1->DR;      //SPI_I2S_ReceiveData(SPI1); //返回SPI接收的数据。

回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
发表于 2013-4-11 13:39:23 | 显示全部楼层
我的程序经常死在
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET;
刚开始运行挺好的
努力?奋斗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-21 16:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表