初级会员
- 积分
- 93
- 金钱
- 93
- 注册时间
- 2012-10-15
- 在线时间
- 4 小时
|
<div>(程序在下方)<br />
<div>我利用STM32的SPI控制NRF2401,在读寄存器时总是只能读到NRF的状态寄存器值0x0E, 而读不到指定寄存器(0x00配置寄存器)的值. 在调试时我发现, 用JTAG 执行到断点1(下方标出)再执行到断2, 可以成功读到数据. 全部执行则读取不到第二个数据. 按之前的经验一般调试模式成功,实际操作失败大多是时序问题,我试着在很多地方加入延时函数, 还是无法解决.</div>
<div><br />
</div>
请原子大哥帮忙看一下.<br />
<br />
u8 NRF2401_RdReg(u8 addr)</div>
<div>{</div>
<div><span class="Apple-tab-span" style="white-space:pre;"> </span>u8 rxfifo; //此前已将CE=0 CS=1 NRF开机等待100us.</div>
<div><span class="Apple-tab-span" style="white-space:pre;"> </span>NRF2401_ResetCS();</div>
<div><span class="Apple-tab-span" style="white-space:pre;"> </span>while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);<span class="Apple-tab-span" style="white-space:pre;"> </span> //等待缓冲空<span class="Apple-tab-span" style="white-space:pre;"> </span> !!!死循环危险</div>
<div><span class="Apple-tab-span" style="white-space:pre;"> </span>SPI_I2S_SendData(SPI1, addr);</div>
<div><span class="Apple-tab-span" style="white-space:pre;"> </span>while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);<span class="Apple-tab-span" style="white-space:pre;"> </span> //<span class="Apple-tab-span" style="white-space:pre;"> </span>!!!</div>
<div>断1<span class="Apple-tab-span" style="white-space:pre;"> </span>SPI_I2S_SendData(SPI1, 0x00);<span class="Apple-tab-span" style="white-space:pre;"> </span> //随机发送一个数,以接收寄存器内容</div>
<div> while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);<span class="Apple-tab-span" style="white-space:pre;"> </span>//RXNE=1;接收为空,即未接收到数据; !!! </div>
<div>断2<span class="Apple-tab-span" style="white-space:pre;"> </span>rxfifo = SPI1->DR;</div>
<div><span class="Apple-tab-span" style="white-space:pre;"> </span>NRF2401_SetCS();</div>
<div><br />
</div>
<div><span class="Apple-tab-span" style="white-space:pre;"> </span>return rxfifo;</div>
<div>}</div> |
|