C2000中文网
专业的C2000技术问题咨询交流的网站

HVPM sensorless调试

C2000阅读(8)

ti调试手册每个level都要求:Set “EnableFlag” to 1 in the watch window.  The variable named “IsrTicker” will now keep on increasing, confirm this by watching the variable in the watch window. This confirms that the system interrupt is working properly. 

但是官方例程中是这样写的:

while (EnableFlag==TRUE)
{
BackTicker++;

}

我调试的时候Set “EnableFlag” to 1时IsrTicker不变,BackTicker会增加,这是我哪里操作有问题吗?

Susan Yang:需要在realtime模式下,而且还要在expression窗口设置enableFlag为1

IsrTicker是在MainISR中断里面的,查一下能不能进入中断。程序是跑在FLASH还是RAM?是否有选fpu32支持?

ti调试手册每个level都要求:Set “EnableFlag” to 1 in the watch window.  The variable named “IsrTicker” will now keep on increasing, confirm this by watching the variable in the watch window. This confirms that the system interrupt is working properly. 

但是官方例程中是这样写的:

while (EnableFlag==TRUE)
{
BackTicker++;

}

我调试的时候Set “EnableFlag” to 1时IsrTicker不变,BackTicker会增加,这是我哪里操作有问题吗?

user6250902:

回复 Susan Yang:

您好,我的程序是跑在RAM。我点击realtime,出现如下提示:
Do you want to enable realtime mode?
Can't enter realtime mode unless debug events are enabled.
Bit 1 of ST1 must be 0.
(Emulation package 7.0.100.0)
这是哪里有问题吗

HVPM_sensorless 28335调试

C2000阅读(7)

LEVEL2调试中,SpeedRef=0时rg1.out波形正常,SVGEN MACRO输出的波形也正常。SpeedRef=0.3时,波形都是错的,这个可能是什么原因呢?

Green Deng:请问一下,所谓的波形都是错的,大概是怎么样的呢?并且只在0.3时才有问题吗?

LEVEL2调试中,SpeedRef=0时rg1.out波形正常,SVGEN MACRO输出的波形也正常。SpeedRef=0.3时,波形都是错的,这个可能是什么原因呢?

user6250902:

回复 Green Deng:

都是不规则的锯齿波,只要给定速度不为零就有问题。

28377s OTP flash中的bootctrl配置问题

C2000阅读(18)

28377s在仿真时,通过On-Chip Flash,将Z1-BOOTCTRL改为0xFFFFFFFE,点击Program OTPBOOTCTRL,写入成功。想要再次修改Z1-BOOTCTRL为0xFFFFFF5A时却发现不能成功。

已知OTP flash中每一位从1写为0只能写一次,我将Z1-BOOTCTRL中的最后一位写0,改为0xFFFFFFFE后,想要再将其他位由1写为0却无法成功,请问这是什么原因?

Green Deng:OTP只能被编程一次,并且不能被擦除。如果要二次编写的话需要用到flash API函数,并且如你所说,它的每个位只能由“1”改为“0”不可逆。

28377s在仿真时,通过On-Chip Flash,将Z1-BOOTCTRL改为0xFFFFFFFE,点击Program OTPBOOTCTRL,写入成功。想要再次修改Z1-BOOTCTRL为0xFFFFFF5A时却发现不能成功。

已知OTP flash中每一位从1写为0只能写一次,我将Z1-BOOTCTRL中的最后一位写0,改为0xFFFFFFFE后,想要再将其他位由1写为0却无法成功,请问这是什么原因?

user5188513:

回复 Green Deng:

你好,按照你说的用flash API函数。我用ti中的例程在Z1-BOOTCTRL寄存器(0x7801E)写入0xFFFFFF5A,仍然是不能成功。

以下是程序:

Flash_Addr = 0x0007801E,sbuf = 0xFFFFFF5A,length = 2.

void Flash_program(USIGN32 Flash_Addr,USIGN16 *sbuf,USIGN16 length)

{

USIGN32 *Buffer32 = (USIGN32 *)sbuf;

USIGN32 u32Index = 0;

Fapi_StatusType oReturnCheck;

volatile Fapi_FlashStatusType oFlashStatus;

Fapi_FlashStatusWordType oFlashStatusWord;

if(Flash_Addr < 0xC0000){

PUMPREQUEST = 0x5A5A0002;// Give pump ownership to FMC0

// This function is required to initialize the Flash API based on System

// frequency before any other Flash API operation can be performed

// Note that the FMC0 register base address is passed as the parameter

oReturnCheck = Fapi_initializeAPI(F021_CPU0_W0_BASE_ADDRESS, 150);

if(oReturnCheck != Fapi_Status_Success)

{

SciaRegs.SCITXBUF.bit.TXDT = 0xA0;//失败时发送0xA0

while(SciaRegs.SCICTL2.bit.TXEMPTY == 0){}

for(;;);

}

// Fapi_setActiveFlashBank function sets the Flash bank0 and FMC0 for

// further Flash operations to be performed on the bank0.

// Note that the parameter passed is Fapi_FlashBank0 since FMC0 register

// base address is passed to Fapi_initializeAPI()

oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);

if(oReturnCheck != Fapi_Status_Success)

{

SciaRegs.SCITXBUF.bit.TXDT = 0xA0;//失败时发送0xA0

while(SciaRegs.SCICTL2.bit.TXEMPTY == 0){}

for(;;);

}

// Disable ECC so that error is not generated when reading Flash contents

// without ECC

Flash0EccRegs.ECC_ENABLE.bit.ENABLE = 0x0;

u32Index = Flash_Addr;

oReturnCheck = Fapi_issueProgrammingCommand((uint32 *)u32Index,sbuf,

length,0,0,

Fapi_DataOnly);

while(Fapi_checkFsmForReady() == Fapi_Status_FsmBusy);

if(oReturnCheck != Fapi_Status_Success)

{

SciaRegs.SCITXBUF.bit.TXDT = 0xA0;//失败时发送0xA0

while(SciaRegs.SCICTL2.bit.TXEMPTY == 0){}

for(;;);

}

// Read FMSTAT register contents to know the status of FSM

// after program command for any debug

oFlashStatus = Fapi_getFsmStatus();

// Verify the values programmed. The Program step itself does a verify

// as it goes. This verify is a 2nd verification that can be done.

oReturnCheck = Fapi_doVerify((uint32 *)u32Index,length/2,Buffer32,

&oFlashStatusWord);

if(oReturnCheck != Fapi_Status_Success)

{

SciaRegs.SCITXBUF.bit.TXDT = 0xA0;//失败时发送0xA0

while(SciaRegs.SCICTL2.bit.TXEMPTY == 0){}

for(;;);

}

}

}

程序执行Fapi_issueProgrammingCommand时,返回Fapi_Status_Success,但其实目标位置并没有写入正确的0xFFFFFF5A,仍为0xFFFFFFFE.

在执行Fapi_doVerify时,返回Fapi_Error_Fail.

不知道你说的flash API函数是不是我调用的这个函数。麻烦再解答一下,感谢!

HVPM sensorless28335调试LEVEL2

C2000阅读(7)

前段时间level6可以使电机转。放了一段时间电机转不了了(自己做的板子)。现重新从头测试,LEVEL2验证时clark As和Bs波形不是正弦波如下图,电压波形和rg1.out波形正常。可能是什么原因造成的?另外测试level6电机抖动不转,估计的速度值是负值是不是也是这个原因造成的?

Susan Yang:您是如下面这样测量的?

DlogCh1 = (int16)_IQtoIQ15(Ia);
DlogCh2 = (int16)_IQtoIQ15(Ib);
DlogCh3 = (int16)_IQtoIQ15(clarke1.As);
DlogCh4 = (int16)_IQtoIQ15(clarke1.Bs);

前段时间level6可以使电机转。放了一段时间电机转不了了(自己做的板子)。现重新从头测试,LEVEL2验证时clark As和Bs波形不是正弦波如下图,电压波形和rg1.out波形正常。可能是什么原因造成的?另外测试level6电机抖动不转,估计的速度值是负值是不是也是这个原因造成的?

user6250902:

回复 Susan Yang:

DlogCh1 = _IQtoQ15(volt1.VphaseA);DlogCh2 = _IQtoQ15(clarke1.As);DlogCh3 = _IQtoQ15(volt1.VphaseB);DlogCh4 = _IQtoQ15(clarke1.Bs);

用这个测的

28335 EPWM 异常

C2000阅读(5)

大家好!

我在用ePWM的时候碰到了一个奇怪的现象。如下图所示,AQCTLA.bit.CAD设置为2(置1),但是途中红色圈内的PWM脉冲和预想的不一样(应该是比较小的一个脉冲),这种情况会周期性的出现。请问下可能是什么原因呢?谢谢

Green Deng:PWM引脚有外接其他电路吗?会不会是电路中的其他原件充放电造成的。

大家好!

我在用ePWM的时候碰到了一个奇怪的现象。如下图所示,AQCTLA.bit.CAD设置为2(置1),但是途中红色圈内的PWM脉冲和预想的不一样(应该是比较小的一个脉冲),这种情况会周期性的出现。请问下可能是什么原因呢?谢谢

Keting:

回复 Green Deng:

你好,应该不是其他元件充放电造成的,因为我用别的代码跑了是没问题的

大家好!

我在用ePWM的时候碰到了一个奇怪的现象。如下图所示,AQCTLA.bit.CAD设置为2(置1),但是途中红色圈内的PWM脉冲和预想的不一样(应该是比较小的一个脉冲),这种情况会周期性的出现。请问下可能是什么原因呢?谢谢

Green Deng:

回复 Keting:

“AQCTLA.bit.CAD设置为2”的话确定了上升沿的位置,那这个下降沿的长度应该是跟你的AQ_CLEAR的值有关的,即跟你设置的下降沿的位置有关。

大家好!

我在用ePWM的时候碰到了一个奇怪的现象。如下图所示,AQCTLA.bit.CAD设置为2(置1),但是途中红色圈内的PWM脉冲和预想的不一样(应该是比较小的一个脉冲),这种情况会周期性的出现。请问下可能是什么原因呢?谢谢

Keting:

回复 Green Deng:

下降沿是由 AQCTLA.bit.CAU=AQ_CLEAR 设置的。后来我甚至加入了AQCTLA.bit.PRD=AQ_CLEAR,但是仍然会存在图中的情况

由xds100v1換成xds100v3 出現錯誤

C2000阅读(5)

使用xds100v1換成xds100v3 出現錯誤 由學習板 轉成 f28335pgfa g4a 板子燒錄出現問題 

試過換一個ccs版本也不能使用

Susan Yang:xds100v1換成xds100v3?

请详细说明下您的情况。您现在使用的软硬件是怎样的?
由學習板 轉成 f28335pgfa g4a ?具体是什么型号?

使用xds100v1換成xds100v3 出現錯誤 由學習板 轉成 f28335pgfa g4a 板子燒錄出現問題 

試過換一個ccs版本也不能使用

xyz549040622:你的仿真器型号重新选择了吗?

使用xds100v1換成xds100v3 出現錯誤 由學習板 轉成 f28335pgfa g4a 板子燒錄出現問題 

試過換一個ccs版本也不能使用

mangui zhang:仿真器如果能连上目标板说明仿真器没问题
从报错看是map对不上

使用xds100v1換成xds100v3 出現錯誤 由學習板 轉成 f28335pgfa g4a 板子燒錄出現問題 

試過換一個ccs版本也不能使用

user5913644:

回复 mangui zhang:

使用target連接測試的沒有問題 map要如何修改?

使用xds100v1換成xds100v3 出現錯誤 由學習板 轉成 f28335pgfa g4a 板子燒錄出現問題 

試過換一個ccs版本也不能使用

mangui zhang:

回复 user5913644:

看了一下相关帖子.out应该是没有问题的感觉还是与仿真器有关系基于FTDI的这种方案
e2e.ti.com/…/569366

再次发问:280049 CLA运行速度比主CPU慢很多

C2000阅读(9)

测试280049的CLA功能,将正常运行在CPU的ISR()函数由的 CLATASK1()调用。

CPU工程:EPWM1 ZERO产生周期10us的中断调用ISR()函数。ISR()内部开始和结束位置利用GPIO做测试信号,利用示波器检测GPIO信号。主CPU下运行ISR()只需要6us。

CLA工程:EPWM1 ZERO产生周期10us的中断调用CLATASK1(),CLATASK1内部调用ISR(),ISR()内部开始和结束位置利用GPIO做测试信号,利用示波器检测GPIO信号。发现10us不能完成ISR()。

测试:减少ISR()内代码至如下:只有两行读取AD采样值

#pragma FUNC_ALWAYS_INLINE(CLALoopCtrlISR)
inline void CLALoopCtrlISR()
{ TEST3_SET();//GPIO TEST
stClaToCpuPara.iVoutADSample = AdccResultRegs.ADCRESULT0; stClaToCpuPara.iPriCurADSample = AdcbResultRegs.ADCRESULT0;
TEST3_CLR();//GPIO TEST
// Clear INT Flag
EPwm1Regs.ETCLR.bit.INT = 1;
}

示波器检测GPIO信号,CPU执行时间为72ns,CLA执行时间为122ns。

请问我的CLA是不是什么地方没有配置正确,导致执行速度慢。本人英语水平很菜,所以只能在中国平台发问,大师们海涵,我也相信中国的大师能解决我的疑惑。

盼回复,谢谢!我也会积极的做测试。如需要其他信息,请告知。

Green Deng:我认为通过测试GPIO口来测试CLA运行时间不太严谨。可以这样操作:
可以采用一个timer,然后使用软件触发CLA工作,触发CLA开始工作后,timer开始计时,并且在CLA工作完毕后,置起一个标志位,而主函数通过循环检测此标志位来判断何时停止timer从而得到当前计数值后计算CLA运算时间
此外,CCS也提供clock功能,但是本人没有太多使用过,不确定能否用来做此项测试。

测试280049的CLA功能,将正常运行在CPU的ISR()函数由的 CLATASK1()调用。

CPU工程:EPWM1 ZERO产生周期10us的中断调用ISR()函数。ISR()内部开始和结束位置利用GPIO做测试信号,利用示波器检测GPIO信号。主CPU下运行ISR()只需要6us。

CLA工程:EPWM1 ZERO产生周期10us的中断调用CLATASK1(),CLATASK1内部调用ISR(),ISR()内部开始和结束位置利用GPIO做测试信号,利用示波器检测GPIO信号。发现10us不能完成ISR()。

测试:减少ISR()内代码至如下:只有两行读取AD采样值

#pragma FUNC_ALWAYS_INLINE(CLALoopCtrlISR)
inline void CLALoopCtrlISR()
{ TEST3_SET();//GPIO TEST
stClaToCpuPara.iVoutADSample = AdccResultRegs.ADCRESULT0; stClaToCpuPara.iPriCurADSample = AdcbResultRegs.ADCRESULT0;
TEST3_CLR();//GPIO TEST
// Clear INT Flag
EPwm1Regs.ETCLR.bit.INT = 1;
}

示波器检测GPIO信号,CPU执行时间为72ns,CLA执行时间为122ns。

请问我的CLA是不是什么地方没有配置正确,导致执行速度慢。本人英语水平很菜,所以只能在中国平台发问,大师们海涵,我也相信中国的大师能解决我的疑惑。

盼回复,谢谢!我也会积极的做测试。如需要其他信息,请告知。

Aiden:

回复 Green Deng:

谢谢你的回复。为什么GPIO测试不严谨呢?我只是觉得这样测试既简单又直观,或许你指的不严谨是指GPIO的响应回有细微延迟,但是同样的代码量(仅仅两句)在CPU和CLA下运行不应该差别这么大啊。我相信TI的片子不会是这个特性,但是就没有一个TI的员工做过这样的测试吗。应该有一个人能解答我这个问题啊,谢谢TI的大师们啦。

测试280049的CLA功能,将正常运行在CPU的ISR()函数由的 CLATASK1()调用。

CPU工程:EPWM1 ZERO产生周期10us的中断调用ISR()函数。ISR()内部开始和结束位置利用GPIO做测试信号,利用示波器检测GPIO信号。主CPU下运行ISR()只需要6us。

CLA工程:EPWM1 ZERO产生周期10us的中断调用CLATASK1(),CLATASK1内部调用ISR(),ISR()内部开始和结束位置利用GPIO做测试信号,利用示波器检测GPIO信号。发现10us不能完成ISR()。

测试:减少ISR()内代码至如下:只有两行读取AD采样值

#pragma FUNC_ALWAYS_INLINE(CLALoopCtrlISR)
inline void CLALoopCtrlISR()
{ TEST3_SET();//GPIO TEST
stClaToCpuPara.iVoutADSample = AdccResultRegs.ADCRESULT0; stClaToCpuPara.iPriCurADSample = AdcbResultRegs.ADCRESULT0;
TEST3_CLR();//GPIO TEST
// Clear INT Flag
EPwm1Regs.ETCLR.bit.INT = 1;
}

示波器检测GPIO信号,CPU执行时间为72ns,CLA执行时间为122ns。

请问我的CLA是不是什么地方没有配置正确,导致执行速度慢。本人英语水平很菜,所以只能在中国平台发问,大师们海涵,我也相信中国的大师能解决我的疑惑。

盼回复,谢谢!我也会积极的做测试。如需要其他信息,请告知。

Green Deng:

回复 Aiden:

不知道其他工程师是否有做过这样的测试。但是根据E2E上的工程师的说明,CLA仅是擅长浮点运算,其他非浮点运算的操作并没有CPU快。另外还有其他一些列举的原因你可以看一下:e2e.ti.com/…/797405

测试280049的CLA功能,将正常运行在CPU的ISR()函数由的 CLATASK1()调用。

CPU工程:EPWM1 ZERO产生周期10us的中断调用ISR()函数。ISR()内部开始和结束位置利用GPIO做测试信号,利用示波器检测GPIO信号。主CPU下运行ISR()只需要6us。

CLA工程:EPWM1 ZERO产生周期10us的中断调用CLATASK1(),CLATASK1内部调用ISR(),ISR()内部开始和结束位置利用GPIO做测试信号,利用示波器检测GPIO信号。发现10us不能完成ISR()。

测试:减少ISR()内代码至如下:只有两行读取AD采样值

#pragma FUNC_ALWAYS_INLINE(CLALoopCtrlISR)
inline void CLALoopCtrlISR()
{ TEST3_SET();//GPIO TEST
stClaToCpuPara.iVoutADSample = AdccResultRegs.ADCRESULT0; stClaToCpuPara.iPriCurADSample = AdcbResultRegs.ADCRESULT0;
TEST3_CLR();//GPIO TEST
// Clear INT Flag
EPwm1Regs.ETCLR.bit.INT = 1;
}

示波器检测GPIO信号,CPU执行时间为72ns,CLA执行时间为122ns。

请问我的CLA是不是什么地方没有配置正确,导致执行速度慢。本人英语水平很菜,所以只能在中国平台发问,大师们海涵,我也相信中国的大师能解决我的疑惑。

盼回复,谢谢!我也会积极的做测试。如需要其他信息,请告知。

Susan Yang:

回复 Aiden:

赞!谢谢详细分享!

project 一直building的问题

C2000阅读(7)

ccs9在编译完成之后,显示build process done,但是ccs会停留在编译中,显示building project(s): (41%)。

当再次修改完代码之后,再次编译,会出现一个框显示:preparing for buid – please wait, 会停在这个地方,使编译无法进行。

重启ccs,问题消失。但是,编译一段时间之后,又会出现第一行所描述的现象。这个问题最近刚出现,以前没有发现有这个问题。

Green Deng:请问你是编译 每个工程都会出现这种情况吗?还是编译某个工程才有?

ccs9在编译完成之后,显示build process done,但是ccs会停留在编译中,显示building project(s): (41%)。

当再次修改完代码之后,再次编译,会出现一个框显示:preparing for buid – please wait, 会停在这个地方,使编译无法进行。

重启ccs,问题消失。但是,编译一段时间之后,又会出现第一行所描述的现象。这个问题最近刚出现,以前没有发现有这个问题。

mangui zhang:clean一下试试,如果还是不行可能就是软件安装有问题

F28379S 的 EMIF

C2000阅读(6)

我打算采用EMIF来做F28379S和FPGA的通讯,假如硬件的接线都没问题,韧体对于接脚的设定也都没问题:有一根CS、WR、OE、Data bus和Address Bus。但我纳闷的是,F28379S的技术手册是有描述EMIF,可我有点摸不透:要存取FPGA的时候,我们需要设定地址吗?我们需要把数据放在Data bus上?

下列是我手头上的范例程序:

在cmd档案中,有规划技术区块,其中【0x0300000】是否意味着EMIF所管的地址起点?可是我并没有在技术手册里有看过相关的描述..

MEMORY {
PAGE 0: /* Program Memory */
PAGE 1: /* Data Memory */
FPGA_EMIF : origin = 0x0300000, length = 0x000030
}

SECTIONS {
FPGARegsFile : > FPGA_EMIF, PAGE = 1
}

在C档案中,

#pragma DATA_SECTION(FpgaRegs,"FPGARegsFile");
volatile struct FPGA_REGS FpgaRegs;  //把FpgaRegs放在FPGA_EMIF地址中

//FPGA_REGS是个结构,其包含FPGACTRL的字段

FpgaRegs.FPGACTRL.all   = CTRL_REG_CONFIG;

对于上行程序,我不了解,但的确可以执行,而且FPGA也真的把资料写入相对的内存中

我在猜想:因为FpgaRegs是放在EMIF的地址里(?),所以F28379S会让EMIF主动将地址放在Address Bus上,数据放在

Data Bus上,然后其他诸如CS、WR、OE也会根据初始设定,来变更他的状态,故写软件时,【FpgaRegs.FPGACTRL.all 】这个就可视为对内存进行读写

这样的概念对吗?

 

mangui zhang:看一下时序就很明白了确定需要连接的总线,FPGA也就是一个外设,通过CS片选
当选中FPGA时FPGA获取总线,进行数据读取和数据送出,不被片选了FPGA总线设置为高祖

我打算采用EMIF来做F28379S和FPGA的通讯,假如硬件的接线都没问题,韧体对于接脚的设定也都没问题:有一根CS、WR、OE、Data bus和Address Bus。但我纳闷的是,F28379S的技术手册是有描述EMIF,可我有点摸不透:要存取FPGA的时候,我们需要设定地址吗?我们需要把数据放在Data bus上?

下列是我手头上的范例程序:

在cmd档案中,有规划技术区块,其中【0x0300000】是否意味着EMIF所管的地址起点?可是我并没有在技术手册里有看过相关的描述..

MEMORY {
PAGE 0: /* Program Memory */
PAGE 1: /* Data Memory */
FPGA_EMIF : origin = 0x0300000, length = 0x000030
}

SECTIONS {
FPGARegsFile : > FPGA_EMIF, PAGE = 1
}

在C档案中,

#pragma DATA_SECTION(FpgaRegs,"FPGARegsFile");
volatile struct FPGA_REGS FpgaRegs;  //把FpgaRegs放在FPGA_EMIF地址中

//FPGA_REGS是个结构,其包含FPGACTRL的字段

FpgaRegs.FPGACTRL.all   = CTRL_REG_CONFIG;

对于上行程序,我不了解,但的确可以执行,而且FPGA也真的把资料写入相对的内存中

我在猜想:因为FpgaRegs是放在EMIF的地址里(?),所以F28379S会让EMIF主动将地址放在Address Bus上,数据放在

Data Bus上,然后其他诸如CS、WR、OE也会根据初始设定,来变更他的状态,故写软件时,【FpgaRegs.FPGACTRL.all 】这个就可视为对内存进行读写

这样的概念对吗?

 

mangui zhang:

参考附件接口

1323.CPLD.rar

我打算采用EMIF来做F28379S和FPGA的通讯,假如硬件的接线都没问题,韧体对于接脚的设定也都没问题:有一根CS、WR、OE、Data bus和Address Bus。但我纳闷的是,F28379S的技术手册是有描述EMIF,可我有点摸不透:要存取FPGA的时候,我们需要设定地址吗?我们需要把数据放在Data bus上?

下列是我手头上的范例程序:

在cmd档案中,有规划技术区块,其中【0x0300000】是否意味着EMIF所管的地址起点?可是我并没有在技术手册里有看过相关的描述..

MEMORY {
PAGE 0: /* Program Memory */
PAGE 1: /* Data Memory */
FPGA_EMIF : origin = 0x0300000, length = 0x000030
}

SECTIONS {
FPGARegsFile : > FPGA_EMIF, PAGE = 1
}

在C档案中,

#pragma DATA_SECTION(FpgaRegs,"FPGARegsFile");
volatile struct FPGA_REGS FpgaRegs;  //把FpgaRegs放在FPGA_EMIF地址中

//FPGA_REGS是个结构,其包含FPGACTRL的字段

FpgaRegs.FPGACTRL.all   = CTRL_REG_CONFIG;

对于上行程序,我不了解,但的确可以执行,而且FPGA也真的把资料写入相对的内存中

我在猜想:因为FpgaRegs是放在EMIF的地址里(?),所以F28379S会让EMIF主动将地址放在Address Bus上,数据放在

Data Bus上,然后其他诸如CS、WR、OE也会根据初始设定,来变更他的状态,故写软件时,【FpgaRegs.FPGACTRL.all 】这个就可视为对内存进行读写

这样的概念对吗?

 

Wen-Gou Lin:

回复 Green Deng:

假设有如下的程序,

FpgaRegs.FPGACTRL.all   = CTRL_REG_CONFIG;

我可以理解成,EMIF会根据先前设定,打出诸如CS、OE、WR、RD、DataBus和Addr Bus上的各种波形,以便让外界的FPGA去读取。

整个过程,软件工程师是不需要做其他动作,对吗?

我打算采用EMIF来做F28379S和FPGA的通讯,假如硬件的接线都没问题,韧体对于接脚的设定也都没问题:有一根CS、WR、OE、Data bus和Address Bus。但我纳闷的是,F28379S的技术手册是有描述EMIF,可我有点摸不透:要存取FPGA的时候,我们需要设定地址吗?我们需要把数据放在Data bus上?

下列是我手头上的范例程序:

在cmd档案中,有规划技术区块,其中【0x0300000】是否意味着EMIF所管的地址起点?可是我并没有在技术手册里有看过相关的描述..

MEMORY {
PAGE 0: /* Program Memory */
PAGE 1: /* Data Memory */
FPGA_EMIF : origin = 0x0300000, length = 0x000030
}

SECTIONS {
FPGARegsFile : > FPGA_EMIF, PAGE = 1
}

在C档案中,

#pragma DATA_SECTION(FpgaRegs,"FPGARegsFile");
volatile struct FPGA_REGS FpgaRegs;  //把FpgaRegs放在FPGA_EMIF地址中

//FPGA_REGS是个结构,其包含FPGACTRL的字段

FpgaRegs.FPGACTRL.all   = CTRL_REG_CONFIG;

对于上行程序,我不了解,但的确可以执行,而且FPGA也真的把资料写入相对的内存中

我在猜想:因为FpgaRegs是放在EMIF的地址里(?),所以F28379S会让EMIF主动将地址放在Address Bus上,数据放在

Data Bus上,然后其他诸如CS、WR、OE也会根据初始设定,来变更他的状态,故写软件时,【FpgaRegs.FPGACTRL.all 】这个就可视为对内存进行读写

这样的概念对吗?

 

mangui zhang:

回复 Wen-Gou Lin:

只要配置好接口对软件这边就没什么要求了根据手册时序波形FPGA端只需解析
读走数据或者将数据送到总线上让你读走

280049 PWM 模块 中AQ模块toggle功能

C2000阅读(6)

AQ中设置PWMA在Counter= zero的时候进行反转,请问反转之后的结果经过DB模块后,为什么会没有死区?是死区配置问题还是toggle功能就不会产生死区?谢谢

Green Deng:请问你具体指的是哪个寄存器?怎么配置的?

AQ中设置PWMA在Counter= zero的时候进行反转,请问反转之后的结果经过DB模块后,为什么会没有死区?是死区配置问题还是toggle功能就不会产生死区?谢谢

Joe Reng:

回复 Green Deng:

PWM的AQ部分配置如下:
EPwm1Regs.AQCTLA.bit.ZRO= AQ_TOGGLE;

DB配置如下:
EPWM_setRisingEdgeDeadBandDelayInput(EPWM1_BASE,EPWM_DB_INPUT_EPWMA);
EPWM_setFallingEdgeDeadBandDelayInput(EPWM1_BASE,EPWM_DB_INPUT_EPWMA);//配置死区输入模式EPWM_setDeadBandDelayPolarity(EPWM1_BASE,EPWM_DB_RED,EPWM_DB_POLARITY_ACTIVE_HIGH);EPWM_setDeadBandDelayPolarity(EPWM1_BASE,EPWM_DB_FED,EPWM_DB_POLARITY_ACTIVE_LOW);//配置极性EPWM_setDeadBandDelayMode(EPWM1_BASE,EPWM_DB_RED,true);EPWM_setDeadBandDelayMode(EPWM1_BASE,EPWM_DB_FED,true);
EPWM_setDeadBandOutputSwapMode(EPWM1_BASE,EPWM_DB_OUTPUT_A,false);EPWM_setDeadBandOutputSwapMode(EPWM1_BASE,EPWM_DB_OUTPUT_B,false);

在零点处AQ翻转,翻转的结果经过DB模块,原有的上升沿、下降沿死区还会继续存在么?

AQ中设置PWMA在Counter= zero的时候进行反转,请问反转之后的结果经过DB模块后,为什么会没有死区?是死区配置问题还是toggle功能就不会产生死区?谢谢

Green Deng:

回复 Joe Reng:

由于目前还没有F280049的PWM例程,我是用F28335的例程测试的,配置为AQ_TOGGLE原有的死区和上升下降沿都是存在的。

AQ中设置PWMA在Counter= zero的时候进行反转,请问反转之后的结果经过DB模块后,为什么会没有死区?是死区配置问题还是toggle功能就不会产生死区?谢谢

Joe Reng:

回复 Green Deng:

感谢你的回复,原因找到了。现在有另外一个问题:
正如之前所说,PWM2会在Counter=0处发生反转。同步信号采用的是PWM的DCA_EVENT1来进行触发的,请问该触发信号是高有效来触发PWM_SYNC信号么?
测试出来的发现是Event的下降沿触发了PWM2的反转。

致力于C2000的技术推广

联系我们联系我们