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

📄 i2cint.c

📁 群星单片机lm3s1958 iic总线。支持iic0和iic1切换。
💻 C
📖 第 1 页 / 共 2 页
字号:
       
    I2CMasterSlaveAddrSet(I2CM_BASE, I2C_sla, true);  // 主机读操作    
    I2CMasterControl(I2CM_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);// 启动单次读取    
       
    while(I2C_state != STATE_IDLE);   
    if(true == I2CMasterBusy(I2CM_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(I2CM_BASE, I2C_sla, false);     // 主机写操作                                            
    I2C_suba_num--;   
    I2CMasterDataPut(I2CM_BASE,    
                    (I2C_suba >> (8 * I2C_suba_num)));            // 写子地址高字节    
    I2CMasterControl(I2CM_BASE, I2C_MASTER_CMD_BURST_SEND_START);// 突发写操作启动    
       
    while(I2C_state != STATE_IDLE);   
    if(true == I2CMasterBusy(I2CM_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(I2CM_BASE, I2C_sla, true);  // 主机读操作    
        I2CMasterControl(I2CM_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);// 突发读操作启动    
       
        while(I2C_state != STATE_IDLE);   
        if(true == I2CMasterBusy(I2CM_BASE))   
            return (false);   
        else   
            return (true);   
    }   
    else   
        return (false);   
}   
   
   
/*******************************************************************************************  
** 函数名称 :I2C_ISR()  
** 函数功能 :中断读写数据  
** 入口参数 :无  
** 出口参数 :无  
*******************************************************************************************/   
void I2C_ISR (void)   
{   
    I2CMasterIntClear(I2CM_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(I2CM_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(I2CM_BASE, *I2C_buf++);   
                I2C_num--;                
                if(I2C_num == 1)   
                {   
                    I2C_state = STATE_WRITE_FINAL;   
                }             
            }   
            // 继续执行块写操作(run=1)    
            I2CMasterControl(I2CM_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);   
            break;   
        }   
        // 写最后一个数据    
        case STATE_WRITE_FINAL:   
        {   
            I2CMasterDataPut(I2CM_BASE, *I2C_buf);   
            I2C_num--;   
            // 发送停止    
            I2CMasterControl(I2CM_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);   
            // 下一个状态为块写完成    
            I2C_state= STATE_IDLE;   
            break;   
        }   
    
        // 读取一个字节    
        case STATE_READ_ONE:   
        {   
   
            I2CMasterSlaveAddrSet(I2CM_BASE, I2C_sla, true);   
   
            I2CMasterControl(I2CM_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);   
   
            I2C_state= STATE_READ_WAIT;   
   
            break;   
        }   
        // 读取多个字节开始    
        case STATE_READ_FIRST:   
        {   
   
            I2CMasterSlaveAddrSet(I2CM_BASE, I2C_sla, true);   
   
            I2CMasterControl(I2CM_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(I2CM_BASE);   
            I2C_num--;   
   
            I2CMasterControl(I2CM_BASE,   
                             I2C_MASTER_CMD_BURST_RECEIVE_CONT);   
   
            if(I2C_num == 2)   
                I2C_state = STATE_READ_FINAL;   
   
            break;   
        }   
        // 读取最后一个字节    
        case STATE_READ_FINAL:   
        {   
   
            *I2C_buf++ = I2CMasterDataGet(I2CM_BASE);   
            I2C_num--;   
   
            I2CMasterControl(I2CM_BASE,   
                             I2C_MASTER_CMD_BURST_RECEIVE_FINISH);   
   
            I2C_state= STATE_READ_WAIT;   
            break;   
        }   
        // 等待读取一个字节    
        case STATE_READ_WAIT:   
        {   
    
            *I2C_buf++  = I2CMasterDataGet(I2CM_BASE); // 读取数据    
            I2C_num--;   
   
            I2C_state= STATE_IDLE;   
            break;   
        }   
    }   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -