工具/软件:
您好:
我一直在阅读关于使用 EPI 外设的知识、并注意到、有一些用例使用和不使用 UDMA。 我想知道 TI 推荐的方法是什么。 关于背景信息、我的设计使用 TI RTOS。 有一个 TCP 任务通过 POE 接口接收命令、EPI 提供一个从 MCU 到 Lattice FPGA 的接口。 FPGA 控制某些大功率继电器的状态、存在安全互锁装置和其他控制信号。
目前,我计划通过为 FPGA 中的"外设"创建一堆结构指针,然后将这些指针指向 EPI 内存空间中的地址来使用 EPI。 例如、下面列出了一个温度传感器、FPGA 通过类似 SPI 的接口定期轮询该传感器:
//类/结构
/*温度传感器外围数据结构*/
/*寄存器定义*/
typedef 结构
{
//lsb
uint8_t enable:1;//<设置后、外围设备已启用
uint8_t softRst:1;//<设置后、外设保持复位状态
uint8_t modeSelection : 3;//<每个数据表、选择操作模式
uint8_t tempDataFormat:3;//<每个数据表、选择温度数据格式
//MSB
}TempCtrlReg0Type;
typedef 联合体
{
TempCtrlReg0Type 位;
uint8_t 字节;
}TempCtrlReg0UseType;
typedef 结构
{
//lsb
uint8_t faultQueue:2;//<每个数据表、保存与故障相关的数据/设置
Uint8_t ctPinPolarity:1;//<根据数据表、设置 CT 引脚的极性
uint8_t intPinPolarity:1;//<每个数据表、设置 INT 引脚的极性
uint8_t intCtMode:1;//<每个数据表、设置模式
uint8_t shutdown:1;//<每个数据表、将传感器设置为关闭模式
uint8_t unused:1;//< unused bit
int8_t 分辨率:1;//<每个数据表、设置分辨率
//MSB
}TempCtrlReg1Type;
typedef 联合体
{
TempCtrlReg1Type 位;
uint8_t 字节;
}TempCtrlReg1UseType;
typedef 结构
{
//lsb
uint8_t unused:4;//<unused bits
Uint8_t tLOW:1;//<每个数据表、启用低温。 以上
uint8_t thigh:1;//<每个数据表、启用高温。 以上
uint8_t tCrt:1;//<每个数据表、启用临界温度。 以上
Uint8_t nRdy:1;///<每个数据表、nRdy 状态
//MSB
}TempStatusRegType;
typedef 联合体
{
TempStatusRegType 位;
uint8_t 字节;
}TempStatusRegUseType;
typedef 结构
{
//lsb
Uint16_t tempValue0:8;//<双字节值的 lsb 字节
uint16_t tempValue1:8;//<两字节值的 MSB 字节
//MSB
}TempValueRegType;
typedef 联合体
{
TempValueRegType 字节;
uint16_t 已满;
}TempValueRegUseType;
typedef 结构
{
//lsb
Uint16_t tempCritValue0:8;//<双字节值的 lsb 字节
Uint16_t tempCritValue1:8;//<两字节值的 MSB 字节
//MSB
}TempCritValueRegType;
typedef 联合体
{
TempCritValueRegType 字节;
uint16_t 已满;
}TempCritValueRegUseType;
typedef 结构
{
//lsb
uint8_t tHyst:4;
uint8_t unused:4;
}TempHysteResistRegType;
typedef 联合体
{
TempHystepResistRegType 位;
uint8_t 字节;
}TempHysteResistRegisterType;
typedef 结构
{
//lsb
Uint16_t tempHighValue0:8;//<双字节值的 lsb 字节
uint16_t tempHighValue1:8;//<两字节值的 MSB 字节
//MSB
}TempHighValueRegType;
typedef 联合体
{
TempHighValueRegType 字节;
uint16_t 已满;
}TempHighValueRegUseType;
typedef 结构
{
//lsb
Uint16_t tempLowValue0:8;//<双字节值的 lsb 字节
uint16_t tempLowValue1:8;//<两字节值的 MSB 字节
//MSB
}TempLowValueRegType;
typedef 联合体
{
TempLowValueRegType 字节;
uint16_t 已满;
}TempLowValueRegUseType;
/*温度传感器外设寄存器定义*/
typedef 结构
{
//lsb
TempCtrlReg0UseType tempCtrlReg0;
TempCtrlReg1UseType tempCtrlReg1;
TempStatusRegUseType tempStatusReg;
TempValueRegUseType tempValueReg;
TempCritValueRegUseType tempCritValueReg;
TempHysteRespRegUseType tempHysterValueReg;
TempHighValueRegUseType tempHighValueReg;
TempLowValueRegUseType tempLowValueReg;
//MSB
}温度传感器类型;
现在、我的计划实例化此类型的指针、并将其设置为等于 EPI 基址+此外设专用的偏移量。
TempSensorType* tempSense = EPWM_BASE + TEMP_SENSE_ADDR (<-这是 pseduo 代码、旨在传达概念、而不是实现)。
完成此操作后、我只需要对此结构中的元素进行写入或读取、从而在 EPI 上进行写入或读取。 例如、如果我想在 FPGA 中启用此外设、我的代码将如下所示:
tempSense->tempCtrlReg0.bits.enable = 1;
同样道理、如果我想读取使能位所在的整个8位寄存器的值、也想这样做:
uint8_t cntrReg0Val = 0;
ctrlReg0Val = tempSense->tempctrlReg0.byte;
FPGA 中的这些外设将有10到15个、每个外设都将使用结构(和结构指针)来写入和读取 FPGA 内的特定地址位置。
我的问题是使用 UDMA 会有好处吗? 我担心这些事务会花费太多时间、而其他任务(如 TCP 任务)的响应速度可能会降低。
此外、如果我使用 UDMA、我是否必须使用 EPI FIFO、或者内存到内存的传输是否足够、以便对结构的元素进行写入/读取会导致对 EPI 进行相应的写入/读取?
谢谢!