尊敬的TI工程师:
我有一个很费解的问题。
当我使用仿真器,逐个启动CPU1与CPU2的时候,他们是能够正常通过IPC通信传输数据的。
但是当我增加了CPU1BOOTCPU2的代码,脱离仿真器,也是可以正常启动的,因为我设置的CPU1和CPU2的中断指示灯都在正常闪烁工作。
但是,IPC通信不工作,因为CPU2并不更新我CPU1中的数据。
我现在向询问CPU1启动CPU2的过程究竟是什么样的,他们会对IPC产生影响吗,以下是我IPC通信代码:
CPU1:
void CPU1_SentDataTo_CPU2_USER()
{
Uint16 index=0;
float32 *Cpu1ToCpu2Ram = (void *)0x0003FC00;//无类型指针转为浮点数类型指针:*Cpu1ToCpu2Ram代表访问指针指向的实际值。代表把0x0003FC00写入Cpu1ToCpu2Ram
if(IpcRegs.IPCSTS.bit.IPC1 == 1) //如果检测到了远程CPU生成了IPC1事件,该事件为将IPC1置为1。在CPU2中设置好在Ram中读完数据之后再写.表示CPU2读完了数据
{
//预留赋值
//IPC数据装载
//解释一下为什么放大倍数:由于一些原因,在CPU2中的IPC数据只能是int16,表示范围为-32768到32767
//这个范围绝对够用,但要考虑到float32到int16的转换问题,float到int是只保留整数(包含正负) 因此只考虑小数即可,电流可保留2位小数,电压比较大,保留1位小数
//温度不需要
CPU1TOCPU2[0] = AdcFilters.IL1*100;
CPU1TOCPU2[1] = AdcFilters.IL2*100;
CPU1TOCPU2[2] = AdcFilters.IL3*100;
CPU1TOCPU2[3] = AdcFilters.IL4*100;
CPU1TOCPU2[4] = AdcFilters.IL5*100;
CPU1TOCPU2[5] = AdcFilters.IL6*100;
CPU1TOCPU2[6] = AdcFilters.Iin1*100;
CPU1TOCPU2[7] = AdcFilters.Iin2*100;
CPU1TOCPU2[8] = AdcFilters.Iin3*100;
CPU1TOCPU2[9] = AdcFilters.Iin4*100;
CPU1TOCPU2[10] = AdcFilters.Iin5*100;
CPU1TOCPU2[11] = AdcFilters.Iin6*100;
CPU1TOCPU2[12] = AdcFilters.Iout*100;
CPU1TOCPU2[13] = AdcFilters.Ubus*10;
CPU1TOCPU2[14] = AdcFilters.Uout*10;
CPU1TOCPU2[15] = AdcFilters.Uin1*10;
CPU1TOCPU2[16] = AdcFilters.Uin2*10;
CPU1TOCPU2[17] = AdcFilters.Uin3*10;
CPU1TOCPU2[18] = AdcFilters.Uin4*10;
CPU1TOCPU2[19] = AdcFilters.Uin5*10;
CPU1TOCPU2[20] = AdcFilters.Uin6*10;
CPU1TOCPU2[21] = NTCTrans.Temp1;
CPU1TOCPU2[22] = NTCTrans.Temp2;
CPU1TOCPU2[23] = NTCTrans.Temp3;
CPU1TOCPU2[24] = NTCTrans.Temp4;
CPU1TOCPU2[25] = NTCTrans.Temp5;
CPU1TOCPU2[26] = NTCTrans.Temp6;
CPU1TOCPU2[27] = _IPC_DATA.ERROR_OVERCURRENT_IN1_value*100;
CPU1TOCPU2[28] = _IPC_DATA.ERROR_OVERCURRENT_IN2_value*100;
CPU1TOCPU2[29] = _IPC_DATA.ERROR_OVERCURRENT_IN3_value*100;
CPU1TOCPU2[30] = _IPC_DATA.ERROR_OVERCURRENT_IN4_value*100;
CPU1TOCPU2[31] = _IPC_DATA.ERROR_OVERCURRENT_IN5_value*100;
CPU1TOCPU2[32] = _IPC_DATA.ERROR_OVERCURRENT_IN6_value*100;
CPU1TOCPU2[33] = _IPC_DATA.ERROR_OVERCURRENT_OUT_value*100;
CPU1TOCPU2[34] = _IPC_DATA.ERROR_OVERVOLTAGE_IN1_value*10;
CPU1TOCPU2[35] = _IPC_DATA.ERROR_OVERVOLTAGE_IN2_value*10;
CPU1TOCPU2[36] = _IPC_DATA.ERROR_OVERVOLTAGE_IN3_value*10;
CPU1TOCPU2[37] = _IPC_DATA.ERROR_OVERVOLTAGE_IN4_value*10;
CPU1TOCPU2[38] = _IPC_DATA.ERROR_OVERVOLTAGE_IN5_value*10;
CPU1TOCPU2[39] = _IPC_DATA.ERROR_OVERVOLTAGE_IN6_value*10;
CPU1TOCPU2[40] = _IPC_DATA.ERROR_OVERVOLTAGE_BUS_value*10;
CPU1TOCPU2[41] = _IPC_DATA.ERROR_OVERVOLTAGE_OUT_value*10;
CPU1TOCPU2[42] = _IPC_DATA.ERROR_OVERTEMPERATURE_1_value;
CPU1TOCPU2[43] = _IPC_DATA.ERROR_OVERTEMPERATURE_2_value;
CPU1TOCPU2[44] = _IPC_DATA.ERROR_OVERTEMPERATURE_3_value;
CPU1TOCPU2[45] = _IPC_DATA.ERROR_OVERTEMPERATURE_4_value;
CPU1TOCPU2[46] = _IPC_DATA.ERROR_OVERTEMPERATURE_5_value;
CPU1TOCPU2[47] = _IPC_DATA.ERROR_OVERTEMPERATURE_6_value;
CPU1TOCPU2[48] = _IPC_DATA.ERROR_STATU;
CPU1TOCPU2[49] = _IPC_DATA.ERROR_NUM;
CPU1TOCPU2[50] = _IPC_DATA.ERROR_NUM_LAST;
CPU1TOCPU2[51] = _IPC_DATA.DCPRESTATU;
//Ram写入
for (index = 0; index < 60; index++)//Ram一共是1k=1024*16位,float是32位,因此最多写512个变量,数据范围[0,511]
{
*(Cpu1ToCpu2Ram + index) = CPU1TOCPU2[index];//*Cpu1ToCpu2Ram是float32位,因此此处+index,在地址上面会自动加4字节。
}
IpcRegs.IPCSET.bit.IPC0 = 1;//CPU1数据更新完成,触发IPC事件0,表示CPU1完成了数据写
IpcRegs.IPCACK.bit.IPC1 = 1;//清CPU2读取完IPC事件1
M_ClrFlag(STS_IPC_WRITE_OVERTIME);
CNT.CNTIPCWrite = 0;
}
if(M_ChkCounter(CNT.CNTIPCWrite,DELAY_5S) >= 0)
{
M_SetFlag(STS_IPC_WRITE_OVERTIME);
CNT.CNTIPCWrite = 0;
}
}
void CPU1_ReadDataFrom_CPU2_USER()
{
Uint16 index=0;
float32 *Cpu2ToCpu1Ram = (void *)0x0003F800;//无类型指针转为浮点数类型指针:*Cpu2ToCpu1Ram代表访问指针指向的实际值。代表把0x0003F800写入Cpu2ToCpu1Ram
if(IpcRegs.IPCSTS.bit.IPC0 == 1)//检测到CPU2写完了数据
{
for(index = 0; index < 50; index++)//Ram读取
{
CPU1FROMCPU2[index] = *(Cpu2ToCpu1Ram + index);//*Cpu2ToCpu1Ram是float32位,因此此处+index,在地址上面会自动加4字节。
}
_IPC_DATA.START_CONTROL = CPU1FROMCPU2[0];
_IPC_DATA.OVERCURRENT_IN_time = CPU1FROMCPU2[1];
_IPC_DATA.OVERCURRENT_IN_value = CPU1FROMCPU2[2];
_IPC_DATA.OVERCURRENT_OUT_time = CPU1FROMCPU2[3];
_IPC_DATA.OVERCURRENT_OUT_value = CPU1FROMCPU2[4];
_IPC_DATA.OVERTEMPERATURE_time = CPU1FROMCPU2[5];
_IPC_DATA.OVERTEMPERATURE_value = CPU1FROMCPU2[6];
_IPC_DATA.OVERVOLTAGE_IN_time = CPU1FROMCPU2[7];
_IPC_DATA.OVERVOLTAGE_IN_value = CPU1FROMCPU2[8];
_IPC_DATA.OVERVOLTAGE_OUT_time = CPU1FROMCPU2[9];
_IPC_DATA.OVERVOLTAGE_OUT_value = CPU1FROMCPU2[10];
_IPC_DATA.ERROR_CLEAR = CPU1FROMCPU2[11];
_IPC_DATA.ERROR_OPPPSITE_CURRENT_value = CPU1FROMCPU2[12];
IpcRegs.IPCSET.bit.IPC1 = 1;//CPU1数据更新完成,触发IPC事件1,表示CPU1完成了数据读
IpcRegs.IPCACK.bit.IPC0 = 1;//清CPU2写完IPC事件0
M_ClrFlag(STS_IPC_READ_OVERTIME);
CNT.CNTIPCRead = 0;
}
if(M_ChkCounter(CNT.CNTIPCRead,DELAY_5S) >= 0)
{
M_SetFlag(STS_IPC_READ_OVERTIME);
CNT.CNTIPCRead = 0;
}
}
CPU2:
void CPU2_SentDataTo_CPU1_USER()
{
Uint16 index=0;
float32 *Cpu2ToCpu1Ram = (void *)0x0003F800;//无类型指针转为浮点数类型指针:*Cpu2ToCpu1Ram代表访问指针指向的实际值。代表把0x0003F800写入Cpu2ToCpu1Ram
if(IpcRegs.IPCSTS.bit.IPC1 == 1) //如果检测到了远程CPU生成了IPC1事件,该事件为将IPC1置为1。在CPU1中设置好在Ram中读完数据之后再写.表示CPU1读完了数据
{
//预留赋值
//IPC数据装载
CPU2TOCPU1[0] = _IPC_DATA.START_CONTROL;
CPU2TOCPU1[1] = _IPC_DATA.OVERCURRENT_IN_time;
CPU2TOCPU1[2] = _IPC_DATA.OVERCURRENT_IN_value;
CPU2TOCPU1[3] = _IPC_DATA.OVERCURRENT_OUT_time;
CPU2TOCPU1[4] = _IPC_DATA.OVERCURRENT_OUT_value;
CPU2TOCPU1[5] = _IPC_DATA.OVERTEMPERATURE_time;
CPU2TOCPU1[6] = _IPC_DATA.OVERTEMPERATURE_value;
CPU2TOCPU1[7] = _IPC_DATA.OVERVOLTAGE_IN_time;
CPU2TOCPU1[8] = _IPC_DATA.OVERVOLTAGE_IN_value;
CPU2TOCPU1[9] = _IPC_DATA.OVERVOLTAGE_OUT_time;
CPU2TOCPU1[10] = _IPC_DATA.OVERVOLTAGE_OUT_value;
CPU2TOCPU1[11] = _IPC_DATA.ERROR_CLEAR;
CPU2TOCPU1[12] = _IPC_DATA.ERROR_OPPPSITE_CURRENT_value;
CPU2TOCPU1[13] = 0;
CPU2TOCPU1[14] = 0;
CPU2TOCPU1[15] = 0;
CPU2TOCPU1[16] = 0;
CPU2TOCPU1[17] = 0;
CPU2TOCPU1[18] = 0;
CPU2TOCPU1[19] = 0;
CPU2TOCPU1[20] = 0;
CPU2TOCPU1[21] = 0;
CPU2TOCPU1[22]=0;
CPU2TOCPU1[23]=0;
CPU2TOCPU1[24]=0;
CPU2TOCPU1[25]=0;
CPU2TOCPU1[26]=0;
CPU2TOCPU1[27]=0;
CPU2TOCPU1[28]=0;
CPU2TOCPU1[29]=0;
CPU2TOCPU1[30]=0;
CPU2TOCPU1[31]=0;
CPU2TOCPU1[32]=0;
CPU2TOCPU1[33]=0;
//Ram写入
for (index = 0; index < 50; index++)//Ram一共是1k=1024*16位,float是32位,因此最多写512个变量,数据范围[0,511]
{
*(Cpu2ToCpu1Ram + index) = CPU2TOCPU1[index];//*Cpu1ToCpu2Ram是float32位,因此此处+index,在地址上面会自动加4字节。
}
IpcRegs.IPCSET.bit.IPC0 = 1;//CPU2数据更新完成,触发IPC事件0,表示CPU2完成了数据写
IpcRegs.IPCACK.bit.IPC1 = 1;//清CPU1读取完IPC事件1
M_ClrFlag(STS_IPC_WRITE_OVERTIME);
CNT.CNTIPCWrite = 0;
}
if(M_ChkCounter(CNT.CNTIPCWrite,DELAY_5S) >= 0)
{
M_SetFlag(STS_IPC_WRITE_OVERTIME);
CNT.CNTIPCWrite = 0;
}
}
void CPU2_ReadDataFrom_CPU1_USER()
{
Uint16 index=0;
float32 *Cpu1ToCpu2Ram = (void *)0x0003FC00;//无类型指针转为浮点数类型指针:*Cpu1ToCpu2Ram代表访问指针指向的实际值。代表把0x0003FC00写入Cpu1ToCpu2Ram
if(IpcRegs.IPCSTS.bit.IPC0 == 1)//检测到CPU1写完了数据
{
for(index = 0; index < 60; index++)//Ram读取
{
CPU2FROMCPU1[index] = *(Cpu1ToCpu2Ram + index);//*Cpu1ToCpu2Ram是float32位,因此此处+index,在地址上面会自动加4字节。
}
_IPC_DATA.IL1 = CPU2FROMCPU1[0];
_IPC_DATA.IL2 = CPU2FROMCPU1[1];
_IPC_DATA.IL3 = CPU2FROMCPU1[2];
_IPC_DATA.IL4 = CPU2FROMCPU1[3];
_IPC_DATA.IL5 = CPU2FROMCPU1[4];
_IPC_DATA.IL6 = CPU2FROMCPU1[5];
_IPC_DATA.Iin1 = CPU2FROMCPU1[6];
_IPC_DATA.Iin2 = CPU2FROMCPU1[7];
_IPC_DATA.Iin3 = CPU2FROMCPU1[8];
_IPC_DATA.Iin4 = CPU2FROMCPU1[9];
_IPC_DATA.Iin5 = CPU2FROMCPU1[10];
_IPC_DATA.Iin6 = CPU2FROMCPU1[11];
_IPC_DATA.Iout = CPU2FROMCPU1[12];
_IPC_DATA.Ubus = CPU2FROMCPU1[13];
_IPC_DATA.Uout = CPU2FROMCPU1[14];
_IPC_DATA.Uin1 = CPU2FROMCPU1[15];
_IPC_DATA.Uin2 = CPU2FROMCPU1[16];
_IPC_DATA.Uin3 = CPU2FROMCPU1[17];
_IPC_DATA.Uin4 = CPU2FROMCPU1[18];
_IPC_DATA.Uin5 = CPU2FROMCPU1[19];
_IPC_DATA.Uin6 = CPU2FROMCPU1[20];
_IPC_DATA.Temp1 = CPU2FROMCPU1[21];
_IPC_DATA.Temp2 = CPU2FROMCPU1[22];
_IPC_DATA.Temp3 = CPU2FROMCPU1[23];
_IPC_DATA.Temp4 = CPU2FROMCPU1[24];
_IPC_DATA.Temp5 = CPU2FROMCPU1[25];
_IPC_DATA.Temp6 = CPU2FROMCPU1[26];
_IPC_DATA.ERROR_OVERCURRENT_IN1_value = CPU2FROMCPU1[27];
_IPC_DATA.ERROR_OVERCURRENT_IN2_value = CPU2FROMCPU1[28];
_IPC_DATA.ERROR_OVERCURRENT_IN3_value = CPU2FROMCPU1[29];
_IPC_DATA.ERROR_OVERCURRENT_IN4_value = CPU2FROMCPU1[30];
_IPC_DATA.ERROR_OVERCURRENT_IN5_value = CPU2FROMCPU1[31];
_IPC_DATA.ERROR_OVERCURRENT_IN6_value = CPU2FROMCPU1[32];
_IPC_DATA.ERROR_OVERCURRENT_OUT_value = CPU2FROMCPU1[33];
_IPC_DATA.ERROR_OVERVOLTAGE_IN1_value = CPU2FROMCPU1[34];
_IPC_DATA.ERROR_OVERVOLTAGE_IN2_value = CPU2FROMCPU1[35];
_IPC_DATA.ERROR_OVERVOLTAGE_IN3_value = CPU2FROMCPU1[36];
_IPC_DATA.ERROR_OVERVOLTAGE_IN4_value = CPU2FROMCPU1[37];
_IPC_DATA.ERROR_OVERVOLTAGE_IN5_value = CPU2FROMCPU1[38];
_IPC_DATA.ERROR_OVERVOLTAGE_IN6_value = CPU2FROMCPU1[39];
_IPC_DATA.ERROR_OVERVOLTAGE_BUS_value = CPU2FROMCPU1[40];
_IPC_DATA.ERROR_OVERVOLTAGE_OUT_value = CPU2FROMCPU1[41];
_IPC_DATA.ERROR_OVERTEMPERATURE_1_value = CPU2FROMCPU1[42];
_IPC_DATA.ERROR_OVERTEMPERATURE_2_value = CPU2FROMCPU1[43];
_IPC_DATA.ERROR_OVERTEMPERATURE_3_value = CPU2FROMCPU1[44];
_IPC_DATA.ERROR_OVERTEMPERATURE_4_value = CPU2FROMCPU1[45];
_IPC_DATA.ERROR_OVERTEMPERATURE_5_value = CPU2FROMCPU1[46];
_IPC_DATA.ERROR_OVERTEMPERATURE_6_value = CPU2FROMCPU1[47];
_IPC_DATA.ERROR_STATU = CPU2FROMCPU1[48];
_IPC_DATA.ERROR_NUM = CPU2FROMCPU1[49];
_IPC_DATA.ERROR_NUM_LAST = CPU2FROMCPU1[50];
_IPC_DATA.DCPRESTATU = CPU2FROMCPU1[51];
IpcRegs.IPCSET.bit.IPC1 = 1;//CPU2数据更新完成,触发IPC事件1,表示CPU2完成了数据读
IpcRegs.IPCACK.bit.IPC0 = 1;//清CPU1写完IPC事件0
M_ClrFlag(STS_IPC_READ_OVERTIME);
CNT.CNTIPCRead = 0;
}
if(M_ChkCounter(CNT.CNTIPCRead,DELAY_5S) >= 0)
{
M_SetFlag(STS_IPC_READ_OVERTIME);
CNT.CNTIPCRead = 0;
}
}
您好,
CPU1启动CPU2过程,请参考c2000ware中的示例 cpu01_to_cpu02_ipcdrivers_wprotect_cpu1