【前言】 本次设计要求实现dsp读取cpld信息的功能。使用芯片cpld是紫光pango系列芯片PGC2KGLPG144,对应开发环境是紫光的PDS(pango design suite);dsp是tiC200系列芯片TMS320F28374S,开发环境CCS。
1. 需求
实现DSP读取CPLD数据的功能。
2. 分析
- DSP应只做到读取数据的功能,禁止写数据引脚
- CPLD向DSP发送的数据包括:CPLD版本信息;状态信息;故障信息
3. 设计
3.1 IO配置
- 输出方向:
a. 由于DSP只作读的功能,DB0~DB15为数据传输引脚,全配置为输入。
b. EM1WE,EM1OE,EM1RnW,EM1CS2,EM1A0,EM1BA1作对CPLD的控制信号,为输出。 - 本模块所有io皆配置为异步模式。
- 本模块所有io皆配置为普通gpio。
- EM1CS2和EM1OE初始化拉低,允许DSP读取;EM1WE和EM1RnW初始化拉高,禁止DSP写入。
3.2 信息获取
在满足读写使能的前提下,CPLD会根据当前地址信号ADDRESS的大小选择要输出的数据DATA_OUT,包括fault_bit16、state_bit16、大版本信息、小版本信息。具体如下:
a. 地址信号低位为0高位为0,输出CPLD小版本信息;
b. 地址信号低位为1高位为0,输出CPLD大版本信息;
c. 地址信号低位为0高位为1,输出故障信息;
d. 地址信号低位为1高位为1,输出状态信息。
DSP获取CPLD信息函数详见第四节,该函数返回一个16位的二进制数据。
3.3 流程图
4. 编码
4.1 引脚使能
// allow dsp to read
void v_bsp_emif_read_enable(void)
{
GPIO_writePin(EMIF_EM1WE, 1);
GPIO_writePin(EMIF_EM1RNW, 1);
GPIO_writePin(EMIF_EM1CS2, 0);
GPIO_writePin(EMIF_EM1OE, 0);
return;
}
4.2 信息获取
unsigned int ui_get_cpld_data(GE_EMIF_INFO emif_info)
{
unsigned int ui_index;
unsigned int ui_return_temp = 0;
unsigned int ui_return = 0;
switch (emif_info)
{
case CPLD_SMALL_VERSION:
{
GPIO_writePin(EMIF_EM1BA1, 0);
GPIO_writePin(EMIF_EM1A0, 0);
}
break;
case CPLD_LARGE_VERSION:
{
GPIO_writePin(EMIF_EM1BA1, 1);
GPIO_writePin(EMIF_EM1A0, 0);
}
break;
case CPLD_FAULT_INFO:
{
GPIO_writePin(EMIF_EM1BA1, 0);
GPIO_writePin(EMIF_EM1A0, 1);
}
break;
case CPLD_STATE_INFO:
{
GPIO_writePin(EMIF_EM1BA1, 1);
GPIO_writePin(EMIF_EM1A0, 1);
}
break;
default:
{
// no action
}
break;
}
// TODO:有cpld数据上传不及时的风险,考虑控制跟数据读取分开做?
for (ui_index = 0; ui_index < EIMF_DATA_CHANNEL_NUM; ui_index++)
{
uc_data_buffer[emif_info][ui_index] = GPIO_readPin(uc_emif_gpio[ui_index]);
ui_return_temp = uc_data_buffer[emif_info][ui_index] << ui_index;
ui_return |= ui_return_temp;
}
return ui_return;
}
5. 测试
现在freertos任务创建函数里面添加一个cpld_comm_task用来实时更新DSP接收到的信息。任务阻塞时间设置为100ms。信息获取函数处理时间如下所示:
CH1:空闲gpio,进出cpld信息获取函数电平翻转。
6. 总结
- 初次拟定CPLD版本信息为version3.0.1
- 单次获取CPLD全部信息的时间为24微秒
- 本次设计暂未发现CPLD发送不及时的问题。后续测试若出现此问题,改进方法有:
a. 将控制和数据更新分开做。
b. 地址引脚控制后加入适当延时,等待cpld读取端口状态并及时上传。
c. DSP加入滞环控制,如:从故障状态切换回正常状态,需读取cpld故障信息为0xffff(即正常状态下的故障信息返回值)若干次数后才允许切换回正常模式。