主题中讨论的其他器件:PGA411Q1EVM、 PGA411-Q1、 SysConfig、 LAUNCHXL-F28379D
-
Hellow
我遇到的问题与 Vish Raman 在他的原始线程中遇到的问题相同、在该线程中、任何命令请求都使用0x46之类的消息进行响应。 我能否知道这是如何解决的?
我正在尝试通过外部控制器(F28379D)开发套件从 PGA411Q1EVM 读取 Dev_Stat5和 Dev_Stat6寄存器。
F28379D 是主器件
PGA411-EVM 是从器件、
我正在尝试通过 PGA411-EVM 上的 J11 ping 读取寄存器值。
在示波器上、我确认 NCS、SCK 和 SDI 引脚均有效、但 SDO 输出始终为0x41、0XFF、0x41
执行代码后,我会得到 hal_dassert()错误。
感谢您的任何帮助。
下面连接了遵循的代码和引脚连接
逻辑分析仪接收到数据

引脚连接主器件(f28379d)从器件 PGA411_Q1_EVM

//########################################################################################################################
//
//文件:empty_bitfield_driverlib_main.c
//
//标题:空示例
//
//空位字段和 Driverlib 示例
//
//此示例是 bit-Field 和 Driverlib 的空项目设置
//开发。
//
//########################################################################################################################
//$TI 发行版:F2837xD 支持库 v3.10.00.00 $
//$Release Date:Tue May 26 17:13:46 IST 2020 $
//版权所有:
//版权所有(C) 2013-2020 Texas Instruments Incorporated - http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,有无
//如果满足以下条件,则允许进行修改
//满足:
//
//重新分发源代码必须保留上述版权
//注意、此条件列表和以下免责声明。
//
//二进制形式的重新分发必须复制上述版权
//注意、中的条件列表和以下免责声明
//随提供的文档和/或其他材料
//分布。
//
//德州仪器公司的名称和的名称都不是
//其贡献者可用于认可或推广衍生产品
//未经特定的事先书面许可,从该软件下载。
//
//本软件由版权所有者和作者提供
//“原样”以及任何明示或暗示的保证,包括但不包括
//限于对适销性和适用性的暗示保证
//一个特定的目的是免责的。 在任何情况下、版权均不得
//所有者或贡献者应对任何直接、间接、偶然、
//特殊、典型或必然的损害(包括但不包括)
//仅限于采购替代货物或服务;
//数据或利润;或业务中断)
//责任理论,无论是合同责任、严格责任还是侵权行为
//(包括疏忽或其他)以任何方式因使用而产生
//此软件,即使已被告知可能会发生此类损坏。
//$
//########################################################################################################################//
//包含的文件
//#include "F28x_Project.h"
#include "driverlib.h"
#include "device.h"//来自 TIDA-00796
#include /* IQ 数学库*/
#include /*标准输入输出库*/
#include /*字符串和数组(对于 mcmcpy)*/
#include "hal.h"/*硬件管理器*/
#include "pga411.h"/* PGA411-Q1驱动器*/#include "F2837xD_DEVICE.h"
#include "F2837xD_examples.h"
#include "Board1.h"//
//定义
//
#define START_TIMER (x){\
x = CpuTimer1Regs.TIM.all;\
CpuTimer1Regs.TCR.bit.TSS = 0;\
}#define STOP_TIMER (x){\
CpuTimer1Regs.TCR.bit.TSS = 1;\
x = CpuTimer1Regs.TIM.all;\
CpuTimer1Regs.TCR.bit.TRB = 1;\
}
#define RED_LED_LOW GPIO_WritePin (RED_LED、1)// 1低0高
#define RED_LED_HIGH GPIO_WritePin (RED_LED、0)// 0 HIGH#define LOGIC_CHECK_LOW GPIO_WritePin (logic_check、1)// 1低0高
#define LOGIC_CHECK_HIGH GPIO_WritePin (logic_check、0)// 0 HIGH
//未验证
float start_time = 0.0;
float stop_time = 0.0;
//
浮点节拍、TIME_IN_us、时间、温度、temp1;char outbuf[30];//用于字符串转换的 UART 输出数据缓冲器*/
uint16 angle1;/*********
*内部函数原型
(小部分 //*函数从 PGA411读取角度并通过 UART 发送*
void MAIN_GetAngleAndPrint (void);/*函数从 PGA411读取速度并通过 UART 发送*
void MAIN_GetVeloAndPrint (void);/*********
*内部功能
(小部分 //*函数从 PGA411读取角度并通过 UART 发送*
void MAIN_GetAngleAndPrint (空)
{
//使用 IQmathLib 库计算 PGA411-Q1的角度//
//_iq19以0.000001907分辨率存储-4096至4095.9998093 //
int16 angle_raw;//来自 PGA411-Q1寄存器的原始数据//
_IQ 角度;// IQ 数学角度//
//浮点 angle2;//终端命令//
HAL_PutsUART ("角度[Deg]:");//从 PGA411-Q1读取数据//
angle_raw = pga411_ReadReg (DEV_STAT5);
angle_raw 和= 0x1FFF;//仅保留 ORDANGLE 位//
//将最小步长(LSB)与 ORDANGLE 值相乘//
角度=_IQ19mpy (_IQ19 (360.0 / 4096)、_IQ19 (angle_raw));// 12b 示例////原始代码
//角度=_IQ19mpy (_IQ19 (360.0 / 1024)、_IQ19 (angle_raw));// 10位模式示例//
//将 IQ 变量转换为字符串//
_IQ19toa (outbuf、"%4.5f"、角度);
// angle1 =(int) outbuf[0];//打印出缓冲区//
HAL_PutsUART (outbuf);
//终端命令//
HAL_PutsUART ("\t\t");
}/*函数从 PGA411读取速度并通过 UART 发送*
void MAIN_GetVeloAndPrint (void)
{
使用 IQmathLib 库*计算 PGA411-Q1的速度*
/*_iq14以0.000061035分辨率存储-131072至131071.9938965 */
int16 velocity_raw;/*来自 PGA411-Q1寄存器的原始数据*
float velocity_float;//第二个补码到浮点转换的 temp
_IQ 速度;/* IQ 数学速度*
/*终端命令*/
HAL_PutsUART ("Velocity [RPM]:");/*从 PGA411-Q1读取数据*/
Velocity_raw = pga411_ReadReg (DEV_STAT6);/*将第二个补码转换为浮点*/
if (velocity_raw & 0x0800)/*负数? *
{
/*首先转换为正数*/
Velocity_float =(((~velocity_raw)+ 1)& 0x07FF);
Velocity_float *=-1;/*并使 float 变为负*/
}
其他
{
/*正数、仅保留所需的位*/
Velocity_float =(velocity_raw & 0x07FF);
}速度=_IQ14mpy (_IQ14 (60 * 20000000 / 33554432)、_IQ14 (velime_float + 1));/* 12b 示例*///原始代码
//速度=_IQ14mpy (_IQ14 (60 * 20000000 / 2097152)、_IQ14 (velime_float + 1));// 10b 示例*//*将 IQ 变量转换为字符串*/
_IQ14toa (outbuf、"%7.5f"、速度);/*打印出缓冲区*/
HAL_PutsUART (outbuf);
/*终端命令*/
HAL_PutsUART ("\n"r);
}
//
//主函
//
void main (void)
{
//
//初始化设备时钟和外设
//
device_init();//
//将 GPIO 引脚配置为推挽输出
//
DEVICE_initGPIO();//
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
//
interrupt_initModule();//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
interrupt_initVectorTable();//
//初始化板外设。 这由 SysConfig 文件生成
//
Board_init_1 ();////
//// UART 代码结束-可在 LAUNCHXL-F28379D 的引脚19和18上看到
////
GPIO_togglePin (LED1);
DEVICE_DELAY_US (1000000);
HAL_PutsUART ("\r\nhal_PutsUART 函数正在工作! \n\n");
GPIO_togglePin (LED1);
DEVICE_DELAY_US (1000000);
GPIO_writePin (AMODE、0);
GPIO_WritePin (RED_LED、1);
GPIO_WritePin (故障、1);
pga411_Reset ();
pga411_FaultReset();DELAY_US (100000);/* 100ms 延迟*/
pga411_DefaultCfg ();/*在"pga411_regs"中定义的默认配置*/
DELAY_US (10000);/*当激励启用时、抗尖峰脉冲周期为10ms/*无限循环*/
while (1)
{HAL_PutsUART ("\r\nhal_PutsUART 函数正在工作! \n\n");
DELAY_US (100000);/* 100ms 延迟*/
MAIN_GetAngleAndPrint();
MAIN_GetVeloAndPrint();
}}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////// PGA411初始化着色器文件 //////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*********
*基于 PGA411-Q1的 TIDA-00796旋转变压器前端
*模块:PGA411驱动程序
*作者:Jiri Panacek、j-panacek@ti.com
*
*版权所有2016 Texas Instruments Incorporated。 保留所有权利。
秘书长的报告 /#include "pga411.h"
#include "hal.h"
#include "F2837xD_DEVICE.h"
#include "F28x_Project.h"
/*********
*宏
(小部分 /#define CRC_BITCOUNT 24 //对于 CRC6、UINT32的前24位
#define CRC_BYTECOUNT 3 /*用于 CRC6的 UINT32的前3 B *
#define CRC_INITSEED 0x3F // CRC6的初始种子*
#define CRC_POLYNOM 0x5B // CRC = X6+X4+X3+X+1 */#define SPI_dummy 0xF0/*用于读取操作的虚拟 SPI 数据*
#define empty_loop
/*********
*枚举
(小部分 //*********
* typedef
(小部分 //*********
变量、常量
(小部分 /volatile pga411_SPI_FRAME_t pga411_SPI_FRAME ={.addr = 0x00、
.dataout = 0x0000、
.reserved = 0x0、
.mcRC = 0x00
};pga411_reg_t pga411_regs[PGA411_REG_COUNT + 1]=
{
/*内存常量 init */
[DEV_OVUV1]={.read_add = 0x53、.write_add = 0x87、.def_val = 0x8B40}、
[DEV_OVUV2]={.read_add = 0x6B、.write_add = 0x26、.def_val = 0x00ED}、
[DEV_OVUV3]={.read_add = 0x65、.write_add = 0x17、.def_val = 0xFCFF}、
[DEV_OVUV4]={.read_add = 0xEC、.write_add = 0x39、.def_val = 0x07F2}、
[DEV_OVUV5]={.read_add = 0x52、.write_add = 0x75、.def_val = 0x1C00}、
[DEV_OVUV6]={.read_add = 0xE9、.write_add = 0x83、.def_val = 0x038F}、
[DEV_TLOOP_CFG]={.read_add = 0xA6、.write_add = 0x42、.def_val = 0x0514}、
[DEV_AFE_CFG]={.read_add = 0xC2、.write_add = 0x91、.def_val = 0x0005}、
[DEV_PHASE_CFG]={.read_add = 0x57、.write_add = 0x85、.def_val = 0x1400}、
[DEV_CONFIG1]={.read_add = 0xBE、.write_add = 0xEB、.def_val = 0x0002}、
[DEV_CONTROL1 ={.READ_ADD = 0x90、.WRITE_ADD = 0x0D、.def_val = 0x0000}、
[DEV_CONTROL2]={.read_add = 0x63、.write_add = 0x38、.def_val = 0x0000}、
[DEV_CONTROL3 ]={.read_add = 0xDD、.write_add = 0xAE、.def_val = 0x0003}、
[DEV_STAT1]={.read_add = 0x81、.write_add = 0x00、.def_val = 0x0000}、
[DEV_STAT2]={.read_add = 0x4D、.write_add = 0x00、.def_val = 0x0000}、
[DEV_STAT3]={.read_add = 0x84、.write_add = 0x00、.def_val = 0x0000}、
[DEV_STAT4]={.read_add = 0x1F、.write_add = 0x00、.def_val = 0x0000}、
[DEV_STAT5]={.read_add = 0x41、.write_add = 0x00、.def_val = 0x0000}、
[DEV_STAT6]={.read_add = 0x6f、.write_add = 0x00、.def_val = 0x0000}、
[DEV_STAT7]={.read_add = 0xE1、.write_add = 0x00、.def_val = 0x0000}、
[DEV_CLCRC]={.read_add = 0x4F、.write_add = 0xFC、.def_val = 0x0000}、
[DEV_CRC]={.read_add = 0x0F、.write_add = 0xE7、.def_val = 0x0000}、
[CRCCALC]={.read_add = 0xD9、.write_add = 0xFF、.def_val = 0x0000}、
[DEV_EE_CTRL1]={.read_add = 0xE3、.write_add = 0x6E、.def_val = 0x0000}、
[DEV_CRC_CTRL1]={.read_add = 0x7A、.write_add = 0xB6、.def_val = 0x0000}、
[DEV_EE_CTRL4]={.read_add = 0xBA、.write_add = 0x56、.def_val = 0x0000}、
[DEV_UNLK_CTRL1]={.read_add = 0x64、.write_add = 0x95、.def_val = 0x0000}、
/*连续读取需要读取28次。 这对*/大有帮助
[dummy_REG]={.read_add = 0x53、.write_add = 0x87、.def_val = 0x0000}、
};/*********
*内部函数原型
(小部分 //*计算输出数据的 CRC6,函数获取前3B 左对齐数据*/
UINT16 pga411_CRC2 (UINT32数据输入);//通过 SPI 将数据发送到 PGA,对于寄存器使用定义的宏,返回传入帧*/
pga411_spi_frame_t pga411_XmitSPI (uint16 dir、uint16 reg、uint16 wdata);/*********
*内部功能
(小部分 //* CRC6计算-针对 PGA411进行了优化*/
UINT16 pga411_CRC2 (UINT32数据输入)
{
uint16 byte_idx、bit_idx、CRC =(CRC_INITSEED << 2);/*从最高有效(3-2-1)开始逐字节开始*/
对于(byte_idx = CRC_BYTECOUNT;byte_idx >= 1;byte_idx--)
{
/*从左到右 XOR 输入新字节*/
CRC ^=((Datin >>(byte_idx << 3))& 0x000000FF);对于每个字节、/*逐位进行*
对于(bit_idx = 0;bit_idx < 8;bit_idx++)
{
CRC = CRC << 1 ^μ s (CRC & 0x80? (CRC_POLYNOM <<2):0);
}
}返回(CRC >> 2和 CRC_INITSEED);/*恢复两位偏移*/
}
/*将默认配置写入 PGA */
void pga411_DefaultCfg (void)
{
int i;
/*转至诊断状态*/
Pga411_State (DIAG);
/*解锁寄存器*/
pga411_DeviceUnlock();/*前12个寄存器默认为*/
/*注意:对于某些您需要先解锁它们! *
对于(I = 0;I < 12;I++)
{
pga411_XmitSPI (write、i、pga411_regs[i]。def_val);
}/*转至正常状态*/
pga411_State (正常);
}
/*更改状态诊断/正常*/
void pga411_State (UINT16状态)
{
uint16温度;/*进入诊断状态*/
如果(状态= DIAG)
{
/*读取 DEV_CONTROL3寄存器的内容*/
temp = pga411_ReadReg (DEV_CONTROL3);
temp |= 0x0004;//设置位 SPIDIAG *
pga411_WriteReg (DEV_CONTROL3、temp);//完成 R-M-W */
}
/*返回正常状态*/
其他
{
/*读取 DEV_CONTROL1寄存器的内容*/
temp = pga411_ReadReg (DEV_CONTROL1);
temp |= 0x0001;//设置位 DIAGEXIT */
pga411_WriteReg (DEV_CONTROL1、temp);/*完成 R-M-W *
}
}
/*从定义的寄存器读取数据*/
UINT16 pga411_ReadReg (UINT16 reg)
{
/*首次读取返回任何*/
pga411_XmitSPI (读取、寄存器、SPI_dummy);
/*第二次读取返回请求的数据*/
返回(pga411_XmitSPI (读取、寄存器、SPI_dummy).datain);
}pga411_spi_frame_t pga411_XmitSPI (uint16 dir、uint16 reg、uint16 wdata)
{
pga411_spi_frame_t out、in;/*我们是否读取数据? *
if (dir = read){out.addr = pga411_regs[reg].read_add;}//读取地址*/
/*或写入数据? *
否则{out.addr = pga411_regs[reg].write_add;}//写入地址*//*组成帧的其余部分*/
out.dataout = wdata;//实数数据(W)或虚拟数据(R)*/
OUT.RESERVED = 0x00;/*始终为零*/
OUT.MCRC = pga411_CRC2 (out.frame);//计算 TX CRC */
in.frame = hal_Xmit4BSPI (out.frame);/*检查 RX CRC */
if (pga411_CRC2 (in.frame)!= in.scrc)
{
HAL_assert();/*如果出错->终止*/
}返回(in );
}/*将数据写入定义的寄存器*/
void pga411_WriteReg (uint16 reg、uint16数据)
{
//这里我们只是使它变得很好,也可以是宏*/
pga411_XmitSPI (写入、寄存器、数据);
}/*从 PGA 读取所有寄存器*/
void pga411_ReadAll (void)
{
int i;
uint16 rx_data;/*按寄存器(27+1)注册*/
/* PGA411始终返回先前的读取寄存器值*/
/*这就是为什么需要28次读取(第一次读取返回任何数据)*/
对于(I = 0;I < PGA411_REG_COUNT + 1;I++)
{
RX_DATA = pga411_XmitSPI (读取、I、SPI_dummy).datain;/*boolean tick -如果不是第一个周期,则保存数据*/
如果(I)
{
pga411_regs[I - 1].real-val = rx_data;
}
}
}
/*设备解锁(必须处于诊断状态)*/
void pga411_DeviceUnlock (void)
{
Pga411_WriteReg (DEV_UNLK_CTRL1、0x000F);
Pga411_WriteReg (DEV_UNLK_CTRL1、0x0055);
Pga411_WriteReg (DEV_UNLK_CTRL1、0x00AA);
Pga411_WriteReg (DEV_UNLK_CTRL1、0x00F0);
}/* EEPROM 解锁(必须处于诊断状态)*/
void pga411_EEPROMUnlock (void)
{
Pga411_WriteReg (DEV_EE_CTRL4、0x000F);
Pga411_WriteReg (DEV_EE_CTRL4、0x0055);
pga411_WriteReg (DEV_EE_CTRL4、0x00AA);
Pga411_WriteReg (DEV_EE_CTRL4、0x00F0);
}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* PGA411-Q1寄存器及其偏移量*/
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define DEV_OVUV1 0x00
#define DEV_OVUV2 0x01
#define DEV_OVUV3 0x02
#define DEV_OVUV4 0x03
#define DEV_OVUV5 0x04
#define DEV_OVUV6 0x05
#define DEV_TLOOP_CFG 0x06
#define DEV_AFE_CFG 0x07
#define DEV_PHASE_CFG 0x08
#define DEV_CONFIG1 0x09
#define DEV_CONTROL1 0x0A //需要器件解锁*/
#define DEV_CONTROL2 0x0B //需要解锁器件*/
#define DEV_CONTROL3 0x0C
#define DEV_STAT1 0x0D
#define DEV_STAT2 0x0E
#define DEV_STAT3 0x0F
#define DEV_STAT4 0x10
#define DEV_STAT5 0x11
#define DEV_STAT6 0x12
#define DEV_STAT7 0x13
#define DEV_CLCRC 0x14
#define DEV_CRC 0x15
#define CRCCALC 0x16
#define DEV_EE_CTRL1 0x17 /*需要 EEPROM 解锁*/
#define DEV_CRC_CTRL1 0x18
#define DEV_EE_CTRL4 0x19
#define DEV_UNLK_CTRL1 0x1A
#define dummy_REG 0x1B //这简化了连续读取*/#define PGA411_REG_COUNT 27
#define dummy 0x00 /* dummy for SPI read */