OpenEdv-开源电子网

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

关于STM32F030硬件SPI驱动RF芯片XN297问题

[复制链接]

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-7-19
在线时间
26 小时
发表于 2017-9-29 14:57:59 | 显示全部楼层 |阅读模式
1金钱
先贴初始化代码:
void RfSpiInit(void){
GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef  SPI_InitStructure;
  
    /* Enable the SPI periph */
    RCC_APB2PeriphClockCmd(SPIx_CLK, ENABLE);
  
    /* Enable SCK, MOSI, MISO and NSS GPIO clocks */
    RCC_AHBPeriphClockCmd(SPIx_SCK_GPIO_CLK | SPIx_MISO_GPIO_CLK | SPIx_MOSI_GPIO_CLK, ENABLE);
   
    GPIO_PinAFConfig(SPIx_SCK_GPIO_PORT, SPIx_SCK_SOURCE, SPIx_SCK_AF);
    GPIO_PinAFConfig(SPIx_MOSI_GPIO_PORT, SPIx_MOSI_SOURCE, SPIx_MOSI_AF);
    GPIO_PinAFConfig(SPIx_MISO_GPIO_PORT, SPIx_MISO_SOURCE, SPIx_MISO_AF);     
   
    /* SPI SCK/MOSI/MISO pin configuration */   
    /* SCK */
    GPIO_InitStructure.GPIO_Pin = SPIx_SCK_PIN ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;   
    GPIO_Init(SPIx_SCK_GPIO_PORT, &GPIO_InitStructure);
   
    /* MOSI */
    GPIO_InitStructure.GPIO_Pin = SPIx_MOSI_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;   
    GPIO_Init(SPIx_SCK_GPIO_PORT, &GPIO_InitStructure);
   
    /* MISO */
    GPIO_InitStructure.GPIO_Pin = SPIx_MISO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;   
    GPIO_Init(SPIx_SCK_GPIO_PORT, &GPIO_InitStructure);
     
    /* NSS/CSN/CS */
    GPIO_InitStructure.GPIO_Pin = SPIx_NSS_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
    GPIO_Init(SPIx_NSS_GPIO_PORT, &GPIO_InitStructure);
      
    /* 注意: 在SPI_NSS_Soft模式下,SSI位决定了NSS引脚上(PA4)的电平,
              而SSM=1时释放了NSS引脚,NSS引脚可以用作GPIO口 */
   
    /* SPI configuration -------------------------------------------------------*/
    SPI_I2S_DeInit(SPIx);
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
   
    SPI_Init(SPIx, &SPI_InitStructure);
   
    SPI_RxFIFOThresholdConfig(SPIx, SPI_RxFIFOThreshold_QF);
   
    /* Enable the SPI peripheral */
    SPI_Cmd(SPIx, ENABLE);
    /*  拉低片选 */
    RfSpiDeAssertCSN();

/* 写 */
static void RfRegWrite(uint8_t addr, uint8_t val)
{
    RfSpiAssertCSN();
   
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
   
    SPI_SendData8(SPIx, addr);
   
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
   
    SPI_SendData8(SPIx, val);

    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
   
    RfSpiDeAssertCSN();
   
    SPI_ReceiveData8(SPIx);
}
/* 读操作 */
static uint8_t RfRegRead(uint8_t addr)
{
    uint8_t     u8tmp;
   
    RfSpiAssertCSN();
   
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
   
    SPI_SendData8(SPIx, addr);
   
    /* 读SPI*/
    u8tmp=SPI_ReceiveData8(SPIx);
   
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
      
    /* 给时钟信号 */
    SPI_SendData8(SPIx, 0x00);  
   
    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
   
    u8tmp = SPI_ReceiveData8(SPIx);
   
    RfSpiDeAssertCSN();
         
    return u8tmp;
}

问题 :对寄存器写一个数,再读出来验证。每次读数据函数都要执行2次才能读到正确的值。
SPI MOSI和MISO波形如下
QQ截图20170929145838.png

使用以上读操作,首次执行read都会读到0x0e,第二次执行读操作才会读到0x02。第一次调试32硬件SPI求大神解答一下

最佳答案

查看完整内容[请看2#楼]

问题已解决,初始化注意时序就行
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-7-19
在线时间
26 小时
 楼主| 发表于 2017-9-29 14:58:00 | 显示全部楼层
问题已解决,初始化注意时序就行
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-7-19
在线时间
26 小时
 楼主| 发表于 2017-9-29 15:02:09 | 显示全部楼层
关于读操作函数代码写法,都是根据SPI波形写得,望解答
回复

使用道具 举报

26

主题

193

帖子

8

精华

金牌会员

Rank: 6Rank: 6

积分
1800
金钱
1800
注册时间
2012-8-23
在线时间
57 小时
发表于 2017-9-29 16:05:44 | 显示全部楼层
须弥指间 发表于 2017-9-29 15:02
关于读操作函数代码写法,都是根据SPI波形写得,望解答

https://item.taobao.com/item.htm ... amp;id=545509364910
用这个USB转SPI适配器试试
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 08:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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