Part Number: AM4379
Tool/software: Code Composer Studio
Hey ,I am trying to use the AM4379 QEP function.
below is my init steps:
void POSSPEED_Init(void)
{
uint16_t regval = 0;
uint16_t readval =0;
// Unit Timer for 100Hz at 1000 MHz SYSCLKOUT
HW_WR_REG32(PWMSS_EQEP_QUPRD,10000000);
readval = HW_RD_REG32(PWMSS_EQEP_QUPRD);
UART_printf("\n PWMSS_EQEP_QUPRD is %x \n", readval);
//--------------------------------------------------------------
//正交计数模式选择 14 15位置00 正交编码模式 QSRC
regval = HW_RD_REG16(PWMSS_EQEP_QDECCTL);
regval = regval & 0x3fff;
HW_WR_REG16(PWMSS_EQEP_QDECCTL,regval);
readval = HW_RD_REG32(PWMSS_EQEP_QDECCTL);
UART_printf("\n PWMSS_EQEP_QDECCTL is %x \n", readval);
//------------------------------------------------------------------
//位置计数器不受仿真挂起的影响 14 15 位 写10
regval = HW_RD_REG16(PWMSS_EQEP_QEPCTL);
regval = ((regval & 0x3fff) |0x8000);
HW_WR_REG16(PWMSS_EQEP_QEPCTL,regval);
//位置计数器在索引位置上复位 pcrm=00 QPOSCNT reset on index event //12-13位清零 00
regval = HW_RD_REG16(PWMSS_EQEP_QEPCTL);
regval = regval & 0xcfff;
HW_WR_REG16(PWMSS_EQEP_QEPCTL,regval);
//使能单元定时器 Enable unit timer
regval = HW_RD_REG16(PWMSS_EQEP_QEPCTL);
regval = regval | 0x0002;
HW_WR_REG16(PWMSS_EQEP_QEPCTL,regval);
//QEP捕捉锁存模式 单元超时时候锁存,单元超时的时候位置计数器 等被锁存//第2位置1
regval = HW_RD_REG16(PWMSS_EQEP_QEPCTL);
regval = regval | 0x0004;
HW_WR_REG16(PWMSS_EQEP_QEPCTL,regval);
//位置计数器使能 eQEP position counter is enabled
regval = HW_RD_REG16(PWMSS_EQEP_QEPCTL);
regval = regval | 0x0008;
HW_WR_REG16(PWMSS_EQEP_QEPCTL,regval);
readval = HW_RD_REG16(PWMSS_EQEP_QEPCTL);
UART_printf("\n PWMSS_EQEP_QEPCTL is %x \n", readval);
//-------------------------------------------------------------------------------
//最大位置计数器
HW_WR_REG32(PWMSS_EQEP_QPOSMAX,0xffffffff);
UART_printf("\n PWMSS_EQEP_QPOSMAX is %x \n", HW_RD_REG32(PWMSS_EQEP_QPOSMAX));
//-----------------------------------------------------------------------------
//单元位置事件预分频器 32分频 5
regval = HW_RD_REG16(PWMSS_EQEP_QCAPCTL);
regval = ((regval & 0xfff0) |0x0005);
HW_WR_REG16(PWMSS_EQEP_QCAPCTL,regval);
//qep捕获时 时钟预分配64
regval = HW_RD_REG16(PWMSS_EQEP_QCAPCTL);
regval = ((regval & 0xff8f) |0x0060);
HW_WR_REG16(PWMSS_EQEP_QCAPCTL,regval);
//使能qep捕获 eQEP capture unit is enabled
regval = HW_RD_REG16(PWMSS_EQEP_QCAPCTL);
regval = regval |0x8000;
HW_WR_REG16(PWMSS_EQEP_QCAPCTL,regval);
readval = HW_RD_REG32(PWMSS_EQEP_QCAPCTL);
UART_printf("\n PWMSS_EQEP_QCAPCTL is %x \n", readval);
//-------------------------------------
}
void InitEQep1Gpio(void)
{
uint32_t regVal;
//16位置0 0-3位写1 enable上拉+ 引脚复用 模式7更改为模式1 QEP模式
regVal = HW_RD_REG32(MY_CTRL_CONF_MCASP0_ACLKR);//eQEP0A_in
regVal =((regVal & 0xfffeffff) |0x00000001);
HW_WR_REG32(MY_CTRL_CONF_MCASP0_ACLKR,regVal);
UART_printf("\n MY_CTRL_CONF_MCASP0_ACLKR is %x \n",regVal);
regVal = HW_RD_REG32(MY_CTRL_CONF_MCASP0_FSX);
regVal =((regVal & 0xfffeffff) |0x00000001);
HW_WR_REG32(MY_CTRL_CONF_MCASP0_FSX,regVal);
UART_printf("\n MY_CTRL_CONF_MCASP0_FSX is %x \n",regVal);
regVal = HW_RD_REG32(MY_CTRL_CONF_MCASP0_AXR1);
regVal =((regVal & 0xfffeffff) |0x00000001);
HW_WR_REG32(MY_CTRL_CONF_MCASP0_AXR1,regVal);
UART_printf("\n MY_CTRL_CONF_MCASP0_AXR1 is %x \n",regVal);
regVal = HW_RD_REG32(MY_CTRL_CONF_MCASP0_AHCLKX);
regVal =((regVal & 0xfffeffff) |0x00000001);
HW_WR_REG32(MY_CTRL_CONF_MCASP0_AHCLKX,regVal);
UART_printf("\n MY_CTRL_CONF_MCASP0_AHCLKX is %x \n",regVal);
//时钟开启
/* Enabling the qep clock for the PWMSS0 module */
regVal= HW_RD_REG32(QEP_BASE_ADDRESS_PWMSS0_CLKCONFIG);
regVal = regVal |0x100;
HW_WR_REG32(QEP_BASE_ADDRESS_PWMSS0_CLKCONFIG,regVal);
UART_printf("\n CLKCONFIG is %x \n",regVal );
/*Enabling the Time-base clock for the PWMMSS0 module */
regVal= HW_RD_REG32(CONTROL_MODULE_CTRL_PWMSS0);
regVal = regVal |0x1;
HW_WR_REG32(CONTROL_MODULE_CTRL_PWMSS0,regVal);
UART_printf("\n PWMSS0 is %x \n",regVal );
}
-------------------------------------------------------------------------------------------------------------------------------
//position speed caculate
void POSSPEED_Calc(void)
{
long tmp;
int pos16bval;
uint32_t tempval = HW_RD_REG16(PWMSS_EQEP_QEPSTS );
UART_printf("\n PWMSS_EQEP_QEPSTS is %x \n",tempval);
int DirectionQep = (tempval & 0x0020)>>5;
}
-----------------------------------------------------------------------------------
question:
why the direction does not change .
do i miss something?