应用在驱动三相无刷直流电机的应用中使用 TMS320F28062。
应用程序已经很好地运行了很长时间。
GPIO0至 GPIO5用作 EPWM1至 EPWM3来驱动电机 FET。
在引导期间、GPIO0-5被设定为高电平和低电平、并且每个状态被检查以验证它们是否都工作正常。
这由以下函数 MotorTest()执行。
问题出在这里。
在软件验证期间必须证明,如果任何 GPIO0-5短路为低电平或高电平,MotorTest()将失败。
为此、GPIO0-5中的每一个都由一个100欧姆电阻器一次加载到 GND 或+3.3V。 这使得 GPIO 上的高电平仅达到0.3V、而低电平仅达到3.1V。 因此、当 GPIO0-5中的任何一个设置为高电平并加载100欧姆至 GND 时、引脚仅达到0.3V、但读取 GPADAT 返回1。 当 GPIO0-5中的任何一个设置为低电平并加载100欧姆至+3.3V 时、引脚仅达到3.1V、但读取 GPADAT 返回0。
MotorTest()始终通过。
因此、读取 GPADAT 似乎不会读取引脚状态、而是读取输出锁存器。 此器件的所有文档都明确指出、读取 GPADAT 将始终返回引脚状态、而不是锁存器。
有人能告诉我为什么会发生这种情况吗?
以下是函数:
//此函数测试 GPIO0到 GPIO5的所有值都可以设置为高电平和低电平
//通过设置为高电平、读取以验证、每次测试一个 GPIO0到 GPIO5
//然后设置低电平并读取以进行验证。
uint16_t MotorTest (void)
{
uint16_t ERROR = 0;
uint32_t val32;
uint32_t mask32;
volatile uint16_t i;
EALLOW; //启用 EALLOW 受保护寄存器访问
GpioDataRegs.GPACLEAR.ALL = 0x3F; // GPIO0-5的输出锁存器全部设置为0
GpioCtrlRegs.GPAMUX1.ALL = 0x0000;// GPIO0-GPIO15上的 GPIO 功能
GpioCtrlRegs.GPADIR.ALL = 0x003F;// GPIO0-5为输出、GPIO6-GPIO31为输入
GpioCtrlRegs.GPAQSEL1.ALL = 0x0000;// GPIO0-GPIO15同步到 SYSCLKOUT
GpioCtrlRegs.GPAPUD.ALL = 0x003F;//在 GPIO0-5上禁用上拉并在上启用
// GPIO6-GPIO31
EDIS; //禁用 EALLOW 受保护寄存器访问
对于(i=0;i<10;i++); //短延迟
//通过 GPIO0向 GPIO5传递一个位
对于(mask32=1UL;mask32<0x040UL;mask32<=1)
{
//将 GPIO0-5的其中一个设置为高电平、仅验证它是否为高电平
GpioDataRegs.GPASET.all = mask32; //将 GPIO0-5的一个设置为 mask32指定的高电平
对于(i=0;i<10;i++); //短延迟
val32= GpioDataRegs.GPADAT.all 和 MOTOR_IO; //读取 GPADAT
if (val32!= mask32) //测试只有 mask32设置的一个位为高电平
{
错误= 1;
中断;
}
//清除所有 GPIO0-5,验证所有都是低电平
GpioDataRegs.GPACLEAR.all = mask32; //清除 mask32指定的 GPIO0-5中的一个
对于(i=0;i<10;i++); //短延迟
val32= GpioDataRegs.GPADAT.all 和 MOTOR_IO; //读取 GPADAT
if (val32!= 0) //测试所有位都是低电平
{
错误= 1;
中断;
}
}
返回错误;
}