📄 i2c.c
字号:
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 + -