高级会员

- 积分
- 675
- 金钱
- 675
- 注册时间
- 2014-9-17
- 在线时间
- 89 小时
|
发表于 2016-11-23 15:56:27
|
显示全部楼层
u8 I2C_ReadMultiBytes(I2C_TypeDef* I2Cx,u8 I2C_Addr, u8 addr,u8 *buf,u16 num)
{
if (0 == num)
return 0;
if (0 == I2C_PARAM.idle)
return 0;
I2C_PARAM.idle = 0;//busy
I2C_PARAM.id = I2C_Addr;
I2C_PARAM.addr = addr;
I2C_PARAM.index = 0;
I2C_PARAM.r_w = 1; //read
I2C_PARAM.bufLen = num;
I2C_PARAM.pBuff = buf;
I2C_PARAM.FunCallBack = (void (*)(I2C_TypeDef*, void *))_I2cTxIRQ;
I2C_ITConfig(I2Cx, I2C_IT_EVT | I2C_IT_BUF, ENABLE);
I2C_AcknowledgeConfig(I2Cx, ENABLE);
/* Send I2C START condition */
I2C_GenerateSTART(I2Cx, ENABLE);
return num;
}
u8 I2C_WriteMultiBytes(I2C_TypeDef* I2Cx,u8 I2C_Addr, u8 addr,u8 *buf,u16 num)
{
if (0 == num)
return 0;
if (0 == I2C_PARAM.idle)
return 0;
I2C_PARAM.idle = 0;//busy
I2C_PARAM.id = I2C_Addr;
I2C_PARAM.addr = addr;
I2C_PARAM.index = 0;
I2C_PARAM.r_w = 0; //write
I2C_PARAM.bufLen = num;
I2C_PARAM.pBuff = buf;
I2C_PARAM.FunCallBack = (void (*)(I2C_TypeDef*, void *))_I2cTxIRQ;
I2C_ITConfig(I2Cx, I2C_IT_EVT | I2C_IT_BUF, ENABLE);
I2C_AcknowledgeConfig(I2Cx, ENABLE);
/* Send I2C START condition */
I2C_GenerateSTART(I2Cx, ENABLE);
return num;
}
/*******************************************************************************
* Function Name : u8 I2C_IdleState(void)
* Description : 查询是否总线空闲 如果为空闲则读取参数
* Output : return: 0)忙碌 1)空闲
*******************************************************************************/
u8 I2C_IdleState(I2C_TypeDef* I2Cx)
{
return (I2C_PARAM.idle && (!I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)));
}
/*******************************************************************************
* Function Name : static void _I2cTxIRQ(I2C_TypeDef* I2Cx, I2C_PARAM_TYPE *pParam)
* Description : 发送数据中断函数,I2C事件中断函数中回调
*******************************************************************************/
static void _I2cTxIRQ(I2C_TypeDef* I2Cx, I2C_PARAM_TYPE *pParam)
{
switch (I2C_GetLastEvent(I2Cx))
{
/* Test on I2Cx EV5 and clear it */
case I2C_EVENT_MASTER_MODE_SELECT:
I2C_Send7bitAddress(I2Cx, pParam->id, I2C_Direction_Transmitter);
break;
/* Test on I2Cx EV6 and first EV8 and clear them */
case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED:
/* Send the first data */
I2C_SendData(I2Cx, pParam->addr); /* EV8 just after EV6 */
break;
case I2C_EVENT_MASTER_BYTE_TRANSMITTING:
if((pParam->index < pParam->bufLen) && (pParam->r_w == 0))
{
/* Transmit buffer data */
I2C_SendData(I2Cx, pParam->pBuff[pParam->index++]);
}
else
{
I2C_ITConfig(I2Cx, I2C_IT_BUF, DISABLE);
}
break;
/* Test on I2Cx EV8 and clear it */
case I2C_EVENT_MASTER_BYTE_TRANSMITTED:
if (pParam->r_w != 0)
{
pParam->FunCallBack = (void (*)(I2C_TypeDef*, void *))_I2cRxIRQ;
I2C_ITConfig(I2Cx, I2C_IT_BUF, ENABLE);
I2C_GenerateSTART(I2Cx, ENABLE);
}
else
{
I2C_ITConfig(I2Cx, I2C_IT_EVT | I2C_IT_BUF, DISABLE);
I2C_AcknowledgeConfig(I2Cx, DISABLE);
I2C_GenerateSTOP(I2Cx, ENABLE);
pParam->idle = 1; //接收结束标志
}
break;
}
}
/*******************************************************************************
* Function Name : static void _I2cRxIRQ(I2C_TypeDef* I2Cx, I2C_PARAM_TYPE *pParam)
* Description : 接收数据中断函数,I2C事件中断函数中回调
*******************************************************************************/
static void _I2cRxIRQ(I2C_TypeDef* I2Cx, I2C_PARAM_TYPE *pParam)
{
switch (I2C_GetLastEvent(I2Cx))
{
/* Test on I2Cx EV5 and clear it */
case I2C_EVENT_MASTER_MODE_SELECT:
/* Send I2Cx slave Address for write */
I2C_Send7bitAddress(I2Cx, pParam->id, I2C_Direction_Receiver);
break;
/* Test on I2Cx EV6 and first EV8 and clear them */
case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED:
if (pParam->index == (pParam->bufLen - 1))
{
I2C_AcknowledgeConfig(I2Cx, DISABLE);
I2C_GenerateSTOP(I2Cx, ENABLE);
}
break;
/* Test on I2Cx EV2 and clear it */
case I2C_EVENT_MASTER_BYTE_RECEIVED:
pParam->pBuff[pParam->index++] = I2C_ReceiveData(I2Cx);
if (pParam->index == (pParam->bufLen - 1))
{
I2C_AcknowledgeConfig(I2Cx, DISABLE);
I2C_GenerateSTOP(I2Cx, ENABLE);
}
else if (pParam->index >= pParam->bufLen)
{
pParam->FunCallBack = (void (*)(I2C_TypeDef*, void *))_I2cTxIRQ; //默认进接收中断
I2C_ITConfig(I2Cx, I2C_IT_EVT | I2C_IT_BUF, DISABLE);
pParam->idle = 1; //空闲
}
break;
}
} |
|