⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iar-

📁 IAR_example_EasyARM8962.zip
💻
📖 第 1 页 / 共 2 页
字号:
	
	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 + -