|
/*
*********************************************************************************************************
* 函 数 名: 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(); 这个函数后,再读取 版本信息,又完全正确,
望请指教 !!!!!!!!!!!! |
|