主题中讨论的其他器件:DRV8301、 MOTORWARE
工具/软件:Code Composer Studio
大家好、我尝试使用 SPI-B (引脚24-27)与外部芯片进行 SPI 通信。 首先、我尝试使用以下代码来设置 SPI-B、它正常工作。
空 InitSpibGpio()
{
EALLOW;
/*为所选引脚启用内部上拉*/
//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。
//注释掉其他不需要的行。
// GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;//启用 GPIO3上的上拉电阻器(SPISOMIA)
// GpioCtrlRegs.GPAPUD.bit.GPIO5=0;//启用 GPIO5上的上拉电阻器(SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0;//启用 GPIO16上的上拉电阻器(SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0;//启用 GPIO17上的上拉电阻器(SPISOMIA)
GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0;//启用 GPIO18上的上拉电阻器(SPICLKA)
GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0;//启用 GPIO19上的上拉电阻器(SPISTEA)
// GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0;//启用 GPIO54上的上拉电阻器(SPISIMOA)
// GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;//启用 GPIO55上的上拉电阻器(SPISOMIA)
// GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0;//启用 GPIO56上的上拉电阻器(SPICLKA)
// GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0;//启用 GPIO57上的上拉电阻器(SPISTEA)
/*将所选引脚的限定条件设置为仅异步*/
//这将为所选引脚选择异步(无限定条件)。
//注释掉其他不需要的行。
// GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 3;//异步输入 GPIO3 (SPISOMIA)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 3;//异步输入 GPIO5 (SPISIMOA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 3;//异步输入 GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 3;//异步输入 GPIO17 (SPISOMIA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 3;//异步输入 GPIO18 (SPICLKA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 3;//异步输入 GPIO19 (SPISTEA)
// GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3;//异步输入 GPIO54 (SPISIMOA)
// GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3;//异步输入 GPIO55 (SPISOMIA)
// GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3;//异步输入 GPIO56 (SPICLKA)
// GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3;//异步输入 GPIO57 (SPISTEA)
/*使用 GPIO 寄存器配置 SPI-A 引脚*/
//这指定哪些可能的 GPIO 引脚将是 SPI 功能引脚。
//注释掉其他不需要的行。
// GpioCtrlRegs.GPAMUX1.bit.GPIO3=2;//将 GPIO3配置为 SPISOMIA
// GpioCtrlRegs.GPAMUX1.bit.GPIO5=2;//将 GPIO5配置为 SPISIMOA
//GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;//将 GPIO16配置为 SPISIMOA
//GpioCtrlRegs.GPAMUX2.bit.GPIO25=1;//将 GPIO17配置为 SPISOMIA
//GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1;//将 GPIO18配置为 SPICLKA
//GpioCtrlRegs.GPAMUX2.bit.GPIO27=1;//将 GPIO19配置为 SPISTEA
// GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1;//将 GPIO54配置为 SPISIMOA
// GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1;//将 GPIO55配置为 SPISOMIA
// GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1;//将 GPIO56配置为 SPICLKA
// GpioCtrlRegs.GPBMUX2.bit.GPIO57=1;//将 GPIO57配置为 SPISTEA
EDIS;
}
void SPI_Fifo_init()
{
//初始化 SPI FIFO 寄存器
SpibRegs.SPIFFTX.All=0xE040;
SpibRegs.SPIFFRX.All=0x2044;
SpibRegs.SPIFFCT.All=0x0;
}
void SPI_init()
{
SpibRegs.SPICCR.bit.CLKPOLARITY = 1;
SpibRegs.SPICCR.bit.SPICHAR=0xF;
SpibRegs.SPICCR.bit.SPILBK=0;
SpibRegs.SPICCR.bit.SPISWRESET=0;
//SpiaRegs.SPICCR.all =0x000F;//复位打开、上升沿、16位字符位
SpibRegs.SPICTL.bit.CLK_PHASE_=0;
SpibRegs.SPICTL.bit.MASTER_SLAVE = 1;
SpibRegs.SPICTL.bit.OVERRUNINTENA=0;
SpibRegs.SPICTL.bit.Talk=1;
// SpiaRegs.SPICTL.all =0x0006;//0x0006;//启用主控模式、正常相位、
//启用 TALK、禁用 SPI int。
SpibRegs.SPICCR.bit.CLKPOLARITY = 1;
SpibRegs.SPICCR.bit.SPICHAR=0xF;
SpibRegs.SPICCR.bit.SPILBK=0;
SpibRegs.SPICCR.bit.SPISWRESET=1;
//SpiaRegs.SPICCR.all =0x008F;//从复位中撤回 SPI
SpibRegs.SPIBRR =波特率;//0x007F;//0x030C;//波特率
}
SysCtrlRegs.PCLKCR0.bit.SPIANCLK = 1;// SPI-A
SysCtrlRegs.PCLKCR0.bit.SPIBENCLK = 1;// SPI-B
由于在 InstaSpin_FOC 实验项目中没有定义 SpibRegs、因此相同的代码在 InstaSpin-FOC 示例项目中无法正常工作、因此我在 InstaSpin-FOC 示例项目中的 proj_lab10e 中尝试了以下代码。
void HAL_setupSpiB (HAL_Handle handle)
{
HAL_Obj * obj =(HAL_Obj *)句柄;
spi_reset (obj->spiBHandle);
SPI_setMode (obj->spiBHandle、SPI_Mode_Master);
SPI_setClkPolarity (obj->spiHandle、SPI_ClkPolarity_OutputRisingEdge_InputFallingEdge);
SPI_setClkPhase (obj->spiBHandle、SPI_ClkPhase_Normal);
spi_enableTx (obj->spiBHandle);
spi_enableTxFifoEnh (obj->spiBHandle);
spi_enableTxFifo (obj->spiBHandle);
//spi_setTxDelay (obj->spiBHandle、0x0);
spi_setTxDelay (obj->spiBHandle、0);
//spi_setBaudRate (obj->spiBHandle、(spi_baudRate_e)(0x000d));
spi_setBaudRate (obj->spiBHandle、(spi_bauddrate_e)(0x0014));
SPI_setCharLength (obj->spiBHandle、SPI_CharLength _16_Bits);
SPI_setSuspend (obj->spiBHandle、SPI_TxSuspend_free);
spi_enable (obj->spiBHandle);
返回;
}// HAL_setupSpiB()函数结束
void HAL_setupGpios (HAL_Handle handle)
{
HAL_Obj * obj =(HAL_Obj *)句柄;
// PWM1
GPIO_setMode (obj->gpioHandle、GPIO_Number_0、GPIO_0_Mode_EPWM1A);
// PWM2
GPIO_setMode (obj->gpioHandle、GPIO_Number_1、GPIO_1_Mode_EPWM1B);
// PWM3
GPIO_setMode (obj->gpioHandle、GPIO_Number_2、GPIO_2_Mode_EPWM2A);
// PWM4
GPIO_setMode (obj->gpioHandle、GPIO_Number_3、GPIO_3_Mode_EPWM2B);
// PWM5
GPIO_setMode (obj->gpioHandle、GPIO_Number_4、GPIO_4_Mode_EPWM3A);
// PWM6
GPIO_setMode (obj->gpioHandle、GPIO_Number_5、GPIO_5_Mode_EPWM3B);
// PWM-DAC4
GPIO_setMode (obj->gpioHandle、GPIO_Number_6、GPIO_6_Mode_EPWM4A);
//按钮 SW2
GPIO_setMode (obj->gpioHandle、GPIO_Number_7、GPIO_7_Mode_generalpurpose);
GPIO_setDirection (obj->gpioHandle、GPIO_Number_7、GPIO_Direction_Input);
// ADCSOCAO_NOT 或 PWM-DAC3
GPIO_setMode (obj->gpioHandle、GPIO_Number_8、GPIO_8_Mode_EPWM5A);
//按钮 SW1
GPIO_setMode (obj->gpioHandle、GPIO_Number_9、GPIO_9_Mode_generalpurpose);
// PWM-DAC1
GPIO_setMode (obj->gpioHandle、GPIO_Number_10、GPIO_10_Mode_EPWM6A);
// PWM-DAC2
GPIO_setMode (obj->gpioHandle、GPIO_Number_11、GPIO_11_Mode_EPWM6B);
// DRV8301-LED1
GPIO_setMode (obj->gpioHandle、GPIO_Number_12、GPIO_12_Mode_generalpurpose);
// OCTWn
GPIO_setMode (obj->gpioHandle、GPIO_Number_13、GPIO_13_Mode_TZ2_not);
// FAULTn
GPIO_setMode (obj->gpioHandle、GPIO_Number_14、GPIO_14_Mode_TZ3_NOT);
// LED2
GPIO_setMode (obj->gpioHandle、GPIO_Number_15、GPIO_15_Mode_generalpurpose);
//设置 GPIO16-23的鉴定期,5*2*(1/90MHz)=0.11us
// GPIO_setQualificationPeriod (obj->gpioHandle、GPIO_Number_16、5);
// SPI-SIMO
GPIO_setMode (obj->gpioHandle、GPIO_Number_16、GPIO_16_Mode_SPISIMOA);
// GPIO_setMode (obj->gpioHandle、GPIO_Number_16、GPIO_16_Mode_generalpurpose);
// GPIO_setPullup (obj->gpioHandle、GPIO_Number_16、GPIO_Pullup_Enable);
// SPI-SOMI
GPIO_setMode (obj->gpioHandle、GPIO_Number_17、GPIO_17_Mode_SPISOMIA);
// GPIO_setMode (obj->gpioHandle、GPIO_Number_17、GPIO_17_Mode_generalpurpose);
// GPIO_setPullup (obj->gpioHandle、GPIO_Number_17、GPIO_Pullup_Enable);
// SPI-CLK
GPIO_setMode (obj->gpioHandle、GPIO_Number_18、GPIO_18_Mode_SPICLKA);
// GPIO_setMode (obj->gpioHandle、GPIO_Number_18、GPIO_18_Mode_generalpurpose);
// GPIO_setPullup (obj->gpioHandle、GPIO_Number_18、GPIO_Pullup_Enable);
// SPI-STE
GPIO_setMode (obj->gpioHandle、GPIO_Number_19、GPIO_19_Mode_SPISTEA_not);
// GPIO_setMode (obj->gpioHandle、GPIO_Number_19、GPIO_19_Mode_generalpurpose);
// GPIO_setPullup (obj->gpioHandle、GPIO_Number_19、GPIO_Pullup_Enable);
ifdef QEP
// EQEPA
GPIO_setMode (obj->gpioHandle、GPIO_Number_20、GPIO_20_Mode_EQEP1A);
GPIO_setQualification (obj->gpioHandle、GPIO_Number_20、GPIO_QUAL_Sample_3);
// EQEPB
GPIO_setMode (obj->gpioHandle、GPIO_Number_21、GPIO_21_Mode_EQEP1B);
GPIO_setQualification (obj->gpioHandle、GPIO_Number_21、GPIO_QUAL_Sample_3);
//状态
GPIO_setMode (obj->gpioHandle、GPIO_Number_22、GPIO_22_Mode_generalpurpose);
// EQEP1I
GPIO_setMode (obj->gpioHandle、GPIO_Number_23、GPIO_23_Mode_EQEP1I);
GPIO_setQualification (obj->gpioHandle、GPIO_Number_23、GPIO_QUAL_Sample_3);
其他
// EQEPA
GPIO_setMode (obj->gpioHandle、GPIO_Number_20、GPIO_20_Mode_generalpurpose);
// EQEPB
GPIO_setMode (obj->gpioHandle、GPIO_Number_21、GPIO_21_Mode_generalpurpose);
//状态
GPIO_setMode (obj->gpioHandle、GPIO_Number_22、GPIO_22_Mode_generalpurpose);
// EQEP1I
GPIO_setMode (obj->gpioHandle、GPIO_Number_23、GPIO_23_Mode_generalpurpose);
#endif
// SPI SIMO B
GPIO_setMode (obj->gpioHandle、GPIO_Number_24、GPIO_24_Mode_SPISIMOB);
// GPIO_setMode (obj->gpioHandle、GPIO_Number_24、GPIO_24_Mode_generalpurpose);
GPIO_setQualificationPeriod (obj->gpioHandle、GPIO_Number_24,3);
GPIO_setPullup (obj->gpioHandle、GPIO_Number_24、GPIO_Pullup_Enable);
// SPI SOMI B
GPIO_setMode (obj->gpioHandle、GPIO_Number_25、GPIO_25_Mode_SPISOMIB);
// GPIO_setMode (obj->gpioHandle、GPIO_Number_25、GPIO_25_Mode_generalpurpose);
GPIO_setQualificationPeriod (obj->gpioHandle、GPIO_Number_25,3);
GPIO_setPullup (obj->gpioHandle、GPIO_Number_25、GPIO_Pullup_Enable);
// SPI CLK B
GPIO_setMode (obj->gpioHandle、GPIO_Number_26、GPIO_26_Mode_SPICLKB);
// GPIO_setMode (obj->gpioHandle、GPIO_Number_26、GPIO_26_Mode_generalpurpose);
GPIO_setQualificationPeriod (obj->gpioHandle、GPIO_Number_26、3);
GPIO_setPullup (obj->gpioHandle、GPIO_Number_26、GPIO_Pullup_Enable);
// SPI CSn B
GPIO_setMode (obj->gpioHandle、GPIO_Number_27、GPIO_27_Mode_SPISTEB_not);
// GPIO_setMode (obj->gpioHandle、GPIO_Number_27、GPIO_27_Mode_generalpurpose);
GPIO_setQualificationPeriod (obj->gpioHandle、GPIO_Number_27、3);
GPIO_setPullup (obj->gpioHandle、GPIO_Number_27、GPIO_Pullup_Enable);
//无连接
GPIO_setMode (obj->gpioHandle、GPIO_Number_28、GPIO_28_Mode_generalpurpose);
//无连接
GPIO_setMode (obj->gpioHandle、GPIO_Number_29、GPIO_29_Mode_generalpurpose);
//无连接
GPIO_setMode (obj->gpioHandle、GPIO_Number_30、GPIO_30_Mode_generalpurpose);
// controlCARD LED2
GPIO_setMode (obj->gpioHandle、GPIO_Number_31、GPIO_31_Mode_generalpurpose);
GPIO_setLow (obj->gpioHandle、GPIO_Number_31);
GPIO_setDirection (obj->gpioHandle、GPIO_Number_31、GPIO_Direction_Output);
//无连接
GPIO_setMode (obj->gpioHandle、GPIO_Number_32、GPIO_32_Mode_generalpurpose);
//无连接
GPIO_setMode (obj->gpioHandle、GPIO_Number_33、GPIO_33_Mode_generalpurpose);
// controlCARD LED3
GPIO_setMode (obj->gpioHandle、GPIO_Number_34、GPIO_34_Mode_generalpurpose);
GPIO_setLow (obj->gpioHandle、GPIO_Number_34);
GPIO_setDirection (obj->gpioHandle、GPIO_Number_34、GPIO_Direction_Output);
// JTAG
GPIO_setMode (obj->gpioHandle、GPIO_Number_35、GPIO_35_Mode_JTAG_TDI);
GPIO_setMode (obj->gpioHandle、GPIO_Number_36、GPIO_36_Mode_JTAG_TMS);
GPIO_setMode (obj->gpioHandle、GPIO_Number_37、GPIO_37_Mode_JTAG_TDO);
GPIO_setMode (obj->gpioHandle、GPIO_Number_38、GPIO_38_Mode_JTAG_TCK);
// DRV8301使能
GPIO_setMode (obj->gpioHandle、GPIO_Number_39、GPIO_39_Mode_generalpurpose);
// CAP1
GPIO_setMode (obj->gpioHandle、GPIO_Number_40、GPIO_40_Mode_generalpurpose);
GPIO_setDirection (obj->gpioHandle、GPIO_Number_40、GPIO_Direction_Input);
// CAP2
GPIO_setMode (obj->gpioHandle、GPIO_Number_41、GPIO_41_Mode_generalpurpose);
GPIO_setDirection (obj->gpioHandle、GPIO_Number_41、GPIO_Direction_Input);
// CAP3
GPIO_setMode (obj->gpioHandle、GPIO_Number_42、GPIO_42_Mode_generalpurpose);
GPIO_setDirection (obj->gpioHandle、GPIO_Number_42、GPIO_Direction_Input);
// DC_CAL
GPIO_setMode (obj->gpioHandle、GPIO_Number_43、GPIO_43_Mode_generalpurpose);
//无连接
GPIO_setMode (obj->gpioHandle、GPIO_Number_44、GPIO_44_Mode_generalpurpose);
//无连接
GPIO_setMode (obj->gpioHandle、GPIO_Number_50、GPIO_50_Mode_generalpurpose);
// DRV8301使能
GPIO_setMode (obj->gpioHandle、GPIO_Number_51、GPIO_51_Mode_generalpurpose);
GPIO_setLow (obj->gpioHandle、GPIO_Number_51);
GPIO_setDirection (obj->gpioHandle、GPIO_Number_51、GPIO_Direction_Output);
//无连接
GPIO_setMode (obj->gpioHandle、GPIO_Number_52、GPIO_52_Mode_generalpurpose);
//无连接
GPIO_setMode (obj->gpioHandle、GPIO_Number_53、GPIO_53_Mode_generalpurpose);
//无连接
GPIO_setMode (obj->gpioHandle、GPIO_Number_54、GPIO_54_Mode_generalpurpose);
//无连接
GPIO_setMode (obj->gpioHandle、GPIO_Number_55、GPIO_55_Mode_generalpurpose);
//无连接
GPIO_setMode (obj->gpioHandle、GPIO_Number_56、GPIO_56_Mode_generalpurpose);
//无连接
GPIO_setMode (obj->gpioHandle、GPIO_Number_57、GPIO_57_Mode_generalpurpose);
//无连接
GPIO_setMode (obj->gpioHandle、GPIO_Number_58、GPIO_58_Mode_generalpurpose);
返回;
}// HAL_setupGpio()函数结束
clk_enableSpiaClock (obj->clkHandle);
clk_enableSpibClock (obj->clkHandle);
但不知怎么说、我看不到 SPI 时钟输出。 初始化时是否缺少任何内容?
请就此提供帮助!!!