📄 i2cint.c
字号:
I2CMasterSlaveAddrSet(I2C_MASTER_BASE, I2C_sla, true); // 主机读操作
I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);// 启动单次读取
while(I2C_state != STATE_IDLE);
if(true == I2CMasterBusy(I2C_MASTER_BASE))
return (false);
else
return (true);
}
/*
*********************************************************************************************************
** 函数名称 :IRcvStr()
** 函数功能 :向有子地址器件读取N字节数据
** 入口参数 : sla 器件从地址
** suba_type 子地址结构 0-8+X结构 1-单字节地址 2-双字节地址 3-三字节地址
** suba 器件内部物理地址
** *s 将要读取的数据的指针
** no 将要读取的数据的个数
** 出口参数 : TRUE 操作成功
** FALSE 操作失败
*********************************************************************************************************
*/
int IRcvStr(uchar sla, ulong suba, uchar sub_type, uchar *s, uchar no)
{
I2C_sla = sla >> 1;
I2C_buf = s;
I2C_num = no;
I2C_suba = suba;
I2C_opt = 1;
switch(sub_type)
{
// 子地址为“8+x”类型
case 0:
I2C_sla = I2C_sla | ((suba >> 8) & 0x07);
I2C_suba_num = 1;
break;
// 子地址为1个字节
case 1:
I2C_suba_num = 1;
break;
// 子地址为2个字节
case 2:
I2C_suba_num = 2;
break;
// 子地址为3个字节
case 3:
I2C_suba_num = 3;
break;
default: break;
}
if(I2C_suba_num == 1)
{
if(I2C_num == 1)
I2C_state = STATE_READ_ONE;
else
I2C_state = STATE_READ_FIRST;
}
else
I2C_state = STATE_WRITE_NEXT;
I2CMasterSlaveAddrSet(I2C_MASTER_BASE, I2C_sla, false); // 主机写操作
I2C_suba_num--;
I2CMasterDataPut(I2C_MASTER_BASE,
(I2C_suba >> (8 * I2C_suba_num))); // 写子地址高字节
I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_START);// 突发写操作启动
while(I2C_state != STATE_IDLE);
if(true == I2CMasterBusy(I2C_MASTER_BASE))
return (false);
else
return (true);
}
/*
*********************************************************************************************************
** 函数名称:IRvcStrExt()
** 函数功能:向无子地址器件读取N字节数据。
** 入口参数:sla 器件地址
** s 接收数据的变量指针
** no 将要读取的数据的个数
** 出口参数:使用前要初始化好I2C引脚功能和I2C中断,并已使能I2C主模式
** 说明: 至少要读取2个字节
*********************************************************************************************************
*/
int IRvcStrExt(uchar sla, uchar *s, uchar no)
{
I2C_sla = sla >> 1;
I2C_buf = s;
I2C_num = no;
if(I2C_num > 1)
{
if(I2C_num == 2)
I2C_state = STATE_READ_FINAL;
else
I2C_state = STATE_READ_NEXT;
I2CMasterSlaveAddrSet(I2C_MASTER_BASE, I2C_sla, true); // 主机读操作
I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);// 突发读操作启动
while(I2C_state != STATE_IDLE);
if(true == I2CMasterBusy(I2C_MASTER_BASE))
return (false);
else
return (true);
}
else
return (false);
}
/*******************************************************************************************
** 函数名称 :I2C_ISR()
** 函数功能 :中断读写数据
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************/
void I2C_ISR (void)
{
I2CMasterIntClear(I2C_MASTER_BASE); // 清除I2C中断标志
switch(I2C_state)
{
// 空闲状态
case STATE_IDLE:
{
break;
}
// 写完单个字节状态
case STATE_WRITE_ONE:
{
I2C_state = STATE_IDLE;
break;
}
// 写下一个数据
case STATE_WRITE_NEXT:
{
// 将下一个字节写入寄存器
if(I2C_suba_num != 0)
{
I2C_suba_num--;
I2CMasterDataPut(I2C_MASTER_BASE,
(I2C_suba >> (8 * I2C_suba_num)));
if((I2C_suba_num == 0) && I2C_opt == 1)
{
if(I2C_num == 1)
I2C_state = STATE_READ_ONE;
else
I2C_state = STATE_READ_FIRST;
}
}
else
{
I2CMasterDataPut(I2C_MASTER_BASE, *I2C_buf++);
I2C_num--;
if(I2C_num == 1)
{
I2C_state = STATE_WRITE_FINAL;
}
}
// 继续执行块写操作(run=1)
I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
break;
}
// 写最后一个数据
case STATE_WRITE_FINAL:
{
I2CMasterDataPut(I2C_MASTER_BASE, *I2C_buf);
I2C_num--;
// 发送停止
I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
// 下一个状态为块写完成
I2C_state= STATE_IDLE;
break;
}
// 读取一个字节
case STATE_READ_ONE:
{
I2CMasterSlaveAddrSet(I2C_MASTER_BASE, I2C_sla, true);
I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
I2C_state= STATE_READ_WAIT;
break;
}
// 读取多个字节开始
case STATE_READ_FIRST:
{
I2CMasterSlaveAddrSet(I2C_MASTER_BASE, I2C_sla, true);
I2CMasterControl(I2C_MASTER_BASE,
I2C_MASTER_CMD_BURST_RECEIVE_START);
if(I2C_num == 2)
I2C_state = STATE_READ_FINAL;
else
I2C_state = STATE_READ_NEXT;
break;
}
// 读取下一个字节
case STATE_READ_NEXT:
{
*I2C_buf++ = I2CMasterDataGet(I2C_MASTER_BASE);
I2C_num--;
I2CMasterControl(I2C_MASTER_BASE,
I2C_MASTER_CMD_BURST_RECEIVE_CONT);
if(I2C_num == 2)
I2C_state = STATE_READ_FINAL;
break;
}
// 读取最后一个字节
case STATE_READ_FINAL:
{
*I2C_buf++ = I2CMasterDataGet(I2C_MASTER_BASE);
I2C_num--;
I2CMasterControl(I2C_MASTER_BASE,
I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
I2C_state= STATE_READ_WAIT;
break;
}
// 等待读取一个字节
case STATE_READ_WAIT:
{
*I2C_buf++ = I2CMasterDataGet(I2C_MASTER_BASE); // 读取数据
I2C_num--;
I2C_state= STATE_IDLE;
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -