硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4478|回复: 4
收起左侧

[STM32CubeF4] 使用 Cube 裤 操作 si473xx 获取版本 ???

[复制链接]

611

主题

3063

回帖

4916

积分

至尊会员

积分
4916
发表于 2016-4-4 10:52:16 | 显示全部楼层 |阅读模式
/*
*********************************************************************************************************
*    函 数 名: Si47xx_WaitStatus80
*    功能说明: 读取Si4730的状态,等于0x80时返回。
*    形    参: hi2c 定义 i2c变量
                        DevAddress 从器件驱动地址
                        _uiTimeOut : 轮询次数
*                      _ucStopEn : 状态0x80检测成功后,是否发送STOP
*    返 回 值: SI47XX_OK 成功, 其他值失败
*********************************************************************************************************
*/
HAL_StatusTypeDef SI47XX_WaitStatus80(I2C_HandleTypeDef *hi2c,
                                                                            uint16_t DevAddress,
                                                                            unsigned int _uiTimeOut,
                                                                            unsigned char _ucStopEn )
{
//    unsigned int  i = 0;
    unsigned int Timeout = _uiTimeOut;
    uint8_t pData;
   
    // 等待器件状态为 0x80
    if(hi2c->State == HAL_I2C_STATE_READY)
    {
        /* Wait until BUSY flag is reset */
        if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK)
        {
            return HAL_BUSY;
        }

        /* Process Locked */
        __HAL_LOCK(hi2c);
        
        /* Disable Pos */
        hi2c->Instance->CR1 &= ~I2C_CR1_POS;

        hi2c->State = HAL_I2C_STATE_BUSY_RX;
        hi2c->Mode = HAL_I2C_MODE_MEM;
        hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
        hi2c->XferOptions = I2C_NO_OPTION_FRAME;
        
        /* Send Slave Address and Memory Address */
        if(I2C_RequestMemoryReadRadioCustom(hi2c, DevAddress, Timeout) != HAL_OK)
        {
            if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
            {
                /* Process Unlocked */
                __HAL_UNLOCK(hi2c);
                return HAL_ERROR;
            }
            else
            {
                /* Process Unlocked */
                __HAL_UNLOCK(hi2c);
                return HAL_TIMEOUT;
            }
        }

        /* Clear ADDR flag */
        __HAL_I2C_CLEAR_ADDRFLAG(hi2c);

        if(_ucStopEn == SI473XX_SEND_STOP)
        {
            /* Disable Acknowledge */
            hi2c->Instance->CR1 &= ~I2C_CR1_ACK;                    
            
            /* Generate Stop */
            hi2c->Instance->CR1 |= I2C_CR1_STOP;
        }

        /* Wait until RXNE flag is set */
        if(I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout) != HAL_OK)      
        {
            if(hi2c->ErrorCode == HAL_I2C_ERROR_TIMEOUT)
            {
                return HAL_TIMEOUT;
            }
            else
            {
                return HAL_ERROR;
            }
        }
        
        /* Read data from DR */
        pData = hi2c->Instance->DR;                       
        
        if(_ucStopEn == SI473XX_SEND_STOP)
        {
            hi2c->State = HAL_I2C_STATE_READY;
            hi2c->Mode = HAL_I2C_MODE_NONE;
            
            /* Process Unlocked */
            __HAL_UNLOCK(hi2c);
        }
        
        if( ((pData ) == 0x80) || ((pData) == 0x81))            // 0x81 是为了执行0x23指令 读取信号质量
        {
            printf("\r\nSI47xx Wait 0x80 == %#x ", pData);   
            return HAL_OK;
        }
//        else
//            return HAL_ERROR;
        
        return HAL_OK;            
    }
    else
    {
        return HAL_BUSY;
    }

    return HAL_OK;
}




T_ERROR_OP SI47XX_GetRevision(unsigned char *_ReadBuf)
{
  T_ERROR_OP err;
  unsigned char  __RegDat[] = {0x10};
  
  
  /*
  AN332 Rev Rev1.0    9/14    Page 259
  Action          Data      Description

  CMD              0x10       GET_REV
  STATUS          ->0x80      Reply Status. Clear-to-send high.
  RESP1           ->0x1F      Part Number, HEX (0x1F = 31 dec. = Si4731),(0x1E = 30 dec. = Si4730)
  RESP2           ->0x32      Firmware Major Rev, ASCII (0x32 = 2)
  RESP3           ->0x30      Firmware Minor Rev, ASCII (0x30 = 0)
  RESP4           ->0x85      Patch ID MSB, example only
  RESP5           ->0xc5      Patch ID LSB, example only
  RESP6           ->0x32      Component Firmware Major Rev, ASCII (0x32 = 2)
  RESP7           ->0x30      Component Firmware Minor Rev, ASCII (0x30 = 0)
  RESP8           ->0x42      Chip Rev, ASCII (0x42 = revB)
  */

  err = (T_ERROR_OP)SI47XX_PowerUp_Revice(FM_RECEIVER);     // 读取版本时,必须先调用 Si47xx_PowerUp_Revice 这个函数
  if(err != SI47XX_OK)
    return SI47XX_ERROR;   
   
    err = (T_ERROR_OP)OperationSi47XX_2w(RADIO_WRITE,  (unsigned char *) & __RegDat[0], 1);
  if(err != SI47XX_OK)
    return SI47XX_ERROR;  
  
    /*
        第1个形参表示最大轮询次数; 如果成功,返回值uiTimeOut > 0 表示实际轮询次数
        第2个形参0表示结束后不发送STOP, 因为还需要读取器件返回数据
    */  
  // wait CTS = 1
  err = (T_ERROR_OP)SI47XX_WaitStatus80( & hi2c2, SI4730_DEVICE_ADDR_R, 200 , SI473XX_NO_SEND_STOP);      // 不发送应答信号,后续还需要读取返回数据
                                                                                                                                                                                                  // 第一次使用获取到的 STATUS 是0x80 ,但是第二次获取到的是 0xc0 ,发生了错误,不知道是为什么 ???

    if (err != SI47XX_OK)
    {
        return SI47XX_ERROR;
    }
  
  err = (T_ERROR_OP)SI47XX_ReadReturnData(& hi2c2, 8, (unsigned char *) & _ReadBuf[0]);
  
   
  return err;
}





void main()
{

     ... ...  // 初始化
SI47XX_PowerDown();     // a


  err = SI47XX_GetRevision(g_tRadio.RadioBuff);
  if(err == 0)
    {
        printf("\r\nSI47XX_GetRevision = %#x, %#x", g_tRadio.RadioBuff[0], g_tRadio.RadioBuff[1]);
    }
   
    SI47XX_PowerDown();     // b , 当调用次函数后,获取的版本信息又是对的,
  err = SI47XX_GetRevision(g_tRadio.RadioBuff);
  if(err == 0)
    {
        printf("\r\nSI47XX_GetRevision = %#x, %#x", g_tRadio.RadioBuff[0], g_tRadio.RadioBuff[1]);
    }   
   
    SI47XX_PowerDown();     // c , 当调用次函数后,获取的版本信息又是对的,
  err = SI47XX_GetRevision(g_tRadio.RadioBuff);
  if(err == 0)
    {
        printf("\r\nSI47XX_GetRevision = %#x, %#x", g_tRadio.RadioBuff[0], g_tRadio.RadioBuff[1]);
    }

}

吧上面的函数 b、c 函数注释掉后,获取版本失败,原因是 SI47XX_WaitStatus80 这个函数里面的读取  STATUS 这个状态寄存器的值中有错误 ,读取到的值为 0xc0, 不知道是为何 ???
当调用了SI47XX_PowerDown();  这个函数后,再读取 版本信息,又完全正确,


望请指教 !!!!!!!!!!!!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107221
QQ
发表于 2016-4-5 00:50:18 | 显示全部楼层
Cube还没有怎么用过,给楼主帮顶。
回复

使用道具 举报

611

主题

3063

回帖

4916

积分

至尊会员

积分
4916
 楼主| 发表于 2016-4-5 14:08:08 | 显示全部楼层

回 eric2013 的帖子

eric2013:Cube还没有怎么用过,给楼主帮顶。 (2016-04-05 00:50) 
貌似这个cube 的 i2c 库,更加难改啊,有些东东也没有看明白,他奶奶的,怎么这个i2c 整的如此复杂,纠结
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2016-4-6 01:17:38 | 显示全部楼层

回 hpdell 的帖子

hpdell:貌似这个cube 的 i2c 库,更加难改啊,有些东东也没有看明白,他奶奶的,怎么这个i2c 整的如此复杂,纠结 (2016-04-05 14:08)
的确是,ST的I2C做的让人生不如死。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

611

主题

3063

回帖

4916

积分

至尊会员

积分
4916
 楼主| 发表于 2016-4-6 17:12:02 | 显示全部楼层

回 byccc 的帖子

byccc:的确是,ST的I2C做的让人生不如死。
 (2016-04-06 01:17) 
是啊,其实很简单的一个i2c,被st搞的如此复杂,为的就是不交给什么什么的专利费,

其实你自己整也可以,但不要这么复杂嘛,哎
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-22 12:21 , Processed in 0.267243 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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