gpio实现dsp~cpld之间数据传输

【前言】 本次设计要求实现dsp读取cpld信息的功能。使用芯片cpld是紫光pango系列芯片PGC2KGLPG144,对应开发环境是紫光的PDS(pango design suite);dsp是tiC200系列芯片TMS320F28374S,开发环境CCS。

1. 需求

实现DSP读取CPLD数据的功能。

2. 分析

  1. DSP应只做到读取数据的功能,禁止写数据引脚
  2. CPLD向DSP发送的数据包括:CPLD版本信息;状态信息;故障信息

3. 设计

3.1 IO配置

在这里插入图片描述

  1. 输出方向:
    a. 由于DSP只作读的功能,DB0~DB15为数据传输引脚,全配置为输入。
    b. EM1WE,EM1OE,EM1RnW,EM1CS2,EM1A0,EM1BA1作对CPLD的控制信号,为输出。
  2. 本模块所有io皆配置为异步模式。
  3. 本模块所有io皆配置为普通gpio。
  4. 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. 总结

  1. 初次拟定CPLD版本信息为version3.0.1
  2. 单次获取CPLD全部信息的时间为24微秒
  3. 本次设计暂未发现CPLD发送不及时的问题。后续测试若出现此问题,改进方法有:
    a. 将控制和数据更新分开做。
    b. 地址引脚控制后加入适当延时,等待cpld读取端口状态并及时上传。
    c. DSP加入滞环控制,如:从故障状态切换回正常状态,需读取cpld故障信息为0xffff(即正常状态下的故障信息返回值)若干次数后才允许切换回正常模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值