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

📄 i2c.c

📁 汽车测功机源肛码.单片机用的是LPC2104. 实现测速,对涡流机的控制,马达的控制.
💻 C
📖 第 1 页 / 共 2 页
字号:
    INT8U           *pdata;                                                 // 指向data[60]的指针
    
    
    DemaPointBlockInit();                                                   // 调用初始化标定点链表函数
    
    for(i = 0; i < 60; i++) {
        data[i] = 0;
    }
                
    I2cRead(CSI24WC02, data, data, 1, MAX_NUMBER);                             // 从CSI24W02中读取数据,将数据放到data数组中
    
    OSMutexPend(uart0,0,&err);                                              // 此任务要使用串口,为防止其它任务也使用串口,调用互斥型信号量

    for(i = 0; i < MAX_NUMBER; i++){
        CommPutChar(COMM1, data[i], 0);                                     // 将数据写入发送缓冲区
    }

    OSMutexPost(uart0);                                                     // 发出互斥型信号量
    
    if((U0IER & 0x02) == 0){                                                // 如果发送中断是关的
        U0IER |= 0x02;                                                      // 开发送中断
        U0THR = CommGetTxChar(COMM1, &err);                                 // 往发送寄存器写初始值
    }

    SendProgramRunStatus(READ_COMPLETE);                                    // 返回读取完成


    if(data[0] > MAX_DEMA_POINT || data[0] < MIN_DEMA_POINT){               // 如果读出的标定点数大于最大
        return NO_DEMA;
    }

    
    pdata = &data[1];                                                       // 得到指向标定数据的指针

    OS_ENTER_CRITICAL();                                                    // 关中断

    CGJDemaNumber = data[0];
    for(i = 0; i < CGJDemaNumber; i++){                                     // 将读取的数据插入到链表中,并生成已标定数据链表
        
        //id 号        
        pdata++;

        // 存储标定点AD值
        CGJDemaPointTbl[i].ad_value      = *pdata++ << 8;            
        CGJDemaPointTbl[i].ad_value     |= *pdata++;

        // 存储标定点设定值
        CGJDemaPointTbl[i].set_value     = *pdata++ << 8;            
        CGJDemaPointTbl[i].set_value    |= *pdata++;

        // 有效标志
        CGJDemaPointTbl[i].valid         = TRUE;
    }

    OS_EXIT_CRITICAL();                                                     // 开中断
    
    return ALREADY_DEMA;
    
}

/********************************************************************************
* 函数名称: WriteEEPROM
* 功    能: 标定任务调用,在标定完成后,向EEPROM写入标定数据
* 入口参数: 
* 出口参数: 
* 调用模块: I2cWrite()      向CSI24WC02写数据函数
*
* 全局变量: CGJDemaPointTbl 力标定结构变量
*           CGJDemaNumber   标定点数
*--------------------------------------------------------------------------------
* 设计者:   周川福
* 日    期: 06-4-14
* 说    明: 
********************************************************************************/
INT8U WriteEEPROM()
{
    INT8U           i;                                      // 临时变量
    INT8U           data[6];                                // 等待写入EEPROM的数组
    INT8U           adr;                                    // I2c写入地址
    
    
    for(i=0;i<6;i++)
        data[i] = 0;    
        
    adr = 0;                                                // 写入EEPROM存放数据的起始地址:0
    data[0] = adr;
    data[1] = CGJDemaNumber;                                // 取得标定对象的标定点数
    I2cWrite(CSI24WC02, &data[0], 2);
    OSTimeDly(5);

//    OS_ENTER_CRITICAL();
    adr = 1;
    for(i = 0; i < CGJDemaNumber; i++){                     // 将标定的相关数据写入data数组
        data[0]  = adr;                                     // I2c写入地址
        //id
        data[1] = CGJDemaPointTbl[i].id;
        //ad
        data[2] = (CGJDemaPointTbl[i].ad_value >> 8) & 0xff;
        data[3] = CGJDemaPointTbl[i].ad_value & 0xff;
        //value
        data[4] = (CGJDemaPointTbl[i].set_value >> 8) & 0xff;
        data[5] = CGJDemaPointTbl[i].set_value & 0xff;

        I2cWrite(CSI24WC02, &data[0], 6);
        OSTimeDly(20);
        adr += 5;                                           // 地址递增
    }
    
//    OS_EXIT_CRITICAL();
    return  (WRITE_COMPLETE);
}       

/***************************************************************************************
* 函数名称: WriteSpeedSetParameter
* 功    能: 接收到上位机的速度参数设定命令后,将数据写到EEPROM中
* 入口参数: 
* 出口参数: 
* 调用模块: I2cWrite()      向CSI24WC02写数据函数
*
* 全局变量: gtzj_mm, mcmcs
*--------------------------------------------------------------------------------
* 设计者:   饶阳胜
* 日    期: 08-8-28
* 说    明: 
****************************************************************************************/
INT8U   WriteSpeedSetParameter()
{
    INT8U   i, j;
    INT32U  temp;
    INT8U   data[11], *pdata;
    
    data[0] = 0x40;
    pdata   = &data[1];
    for(i = 0; i < 2; i++){
        OS_ENTER_CRITICAL();
        if(i == 0)
            temp = gtzj_mm;
        else
            temp = mcmcs;
        OS_EXIT_CRITICAL();
        for(j = 0; j < 4; j++)
            *pdata++ = (temp >> j * 8) & 0xFF;
    }
    I2cWrite(CSI24WC02,data, 10);
    OSTimeDly(20);

    return (WRITE_COMPLETE);
}   

/***************************************************************************************
* 函数名称: WriteSpeedSetParameter
* 功    能: 接收到上位机的速度参数设定命令后,将数据写到EEPROM中
* 入口参数: 
* 出口参数: 
* 调用模块: I2cWrite()      向CSI24WC02写数据函数
*
* 全局变量: gtzj_mm, mcmcs
*---------------------------------------------------------------------------------------
* 设计者:   饶阳胜
* 日    期: 08-8-28
* 说    明: 
****************************************************************************************/
INT8U ReadSpeedSetParameter()
{
    INT8U   i, j, err;
    INT8U   data[11], *pdata;
    INT32U  temp;
    
    data[0] = 0x40;                                                 // 速度标定数据在EEPROM中的存地址为0x40
    I2cRead(CSI24WC02, data, data, 1, 10);                          // 从CSI24W02中读取数据,将数据放到data数组中
    
    OSMutexPend(uart0,0,&err);                                      // 此任务要使用串口,为防止其它任务也使用串口,调用互斥型信号量
    for(i = 0; i < 10; i++){                                        
        CommPutChar(COMM1, data[i], 0);                             // 将数据写入发送缓冲区
    }
    OSMutexPost(uart0);                                             // 发出互斥型信号量
    if((U0IER & 0x02) == 0){                                        // 如果发送中断是关的
        U0IER |= 0x02;                                              // 开发送中断
        U0THR = CommGetTxChar(COMM1, &err);                         // 往发送寄存器写初始值
    }

    pdata = data;                                                   // 得到指向读取到的数据的指针
    for(i = 0; i < 2; i++){
        temp = 0;
        for(j = 0; j < 4; j++){
            temp |= *pdata++ << j * 8;
        }
        if(i == 0) 
            gtzj_mm = temp;
        else
            mcmcs = temp;
    }
    CountSpeedParameter();

    return  (READ_COMPLETE);
}    

/********************************************************************************
* 函数名称: WritePidParam()
* 功    能: 把PID调节参数写入24C02
* 入口参数: none
* 出口参数: none
* 调用模块: 
*
* 全局变量: G_Kp, G_Ki, G_Kd, G_Kc
*           
*--------------------------------------------------------------------------------
* 设计者:   周川福
* 日    期: 2006-09-06
* 说    明: 
********************************************************************************/
INT8U WritePidParam()
{
    INT8U i, count;
    INT8U addr;
    INT8U data[5], *pdata;   // data[16] PID 参数字节化
    INT32U tmp;
    
    
    addr = 0x60;
    data[0] = addr;         // CAT24WC02 的存储地址

    for(count = 0; count < 4; count++) {

        pdata = &data[1];

        for(i=0; i<4; i++) {

            switch(count) {
                case 0: { 
                       // Kp参数
                       tmp = (INT32U)(G_Kp * 1000);
                       *pdata++ = (tmp >> (i * 8)) & 0xFF;
                       break;
                }
                case 1: { 
                       // Ki参数
                       tmp = (INT32U)(G_Ki * 1000);
                       *pdata++ = (tmp >> (i * 8)) & 0xFF;
                       break;
                }
                case 2: { 
                       // Kd参数
                       tmp = (INT32U)(G_Kd * 100);
                       *pdata++ = (tmp >> (i * 8)) & 0xFF;
                       break;
                }
                case 3: {
                       // Kc参数
                       tmp = (INT32U)(G_Kc * 1000);
                       *pdata++ = (tmp >> (i * 8)) & 0xFF;
                       break;
                }
                default: break;
                        
            }
        }

        I2cWrite(CSI24WC02,&data[0], 5);

        OSTimeDly(10);

        addr += 4;
        data[0] = addr;

    }
    
    return WRITE_COMPLETE;
}
    
/********************************************************************************
* 函数名称: ReadPidParam()
* 功    能: 从24C02读取PID调节参数
* 入口参数: none
* 出口参数: none
* 调用模块: 
*
* 全局变量: G_Kp,G_Ki,G_Kd,G_Kc
*           
*--------------------------------------------------------------------------------
* 设计者:   周川福 
* 日    期: 2006-09-06
* 说    明: 
********************************************************************************/
INT8U ReadPidParam()
{
    INT8U i, count;
    INT8U addr;
    INT8U data[5], *pdata;   // data[16] PID 参数字节化
    INT32U temp;

    addr = 0x60;
    data[0] = addr;         // CAT24WC02 的存储地址

    for(count = 0; count < 4; count++) {

        I2cRead(CSI24WC02, &data[0], data, 1, 4);

        pdata = &data[0];

        temp = 0;

        for(i=0; i<4; i++) {
            temp |= *pdata++ << (i * 8);
        }

        switch(count) {
            case 0: { 
                       // Kp参数
                G_Kp = (FP32)temp / 1000;
                break;
            }
            case 1: { 
                       // Ki参数
                G_Ki = (FP32)temp / 1000;
                break;
            }
            case 2: { 
                       // Kd参数
                G_Kd = (FP32)temp / 100;
                       break;
            }
            case 3: {
                       // Kc参数
                G_Kc = (FP32)temp / 1000;
                break;
            }
        }
                

        OSTimeDly(10);

        addr += 4;
        data[0] = addr;

    }
        
    return READ_COMPLETE;    
}

/*********************************************************************************************************
*                          End Of File
*********************************************************************************************************/

⌨️ 快捷键说明

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