This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430G2553:使用两个SPI模块时出现问题

Guru**** 2552150 points
Other Parts Discussed in Thread: MSP430G2553, AFE4300

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/663224/ccs-msp430g2553-problem-using-both-spi-modules

部件号:MSP430G2553
主题中讨论的其他部件: AFE4300

工具/软件:Code Composer Studio

大家好,

我在msp430g2553上尝试使用两个SPI模块时遇到问题。 我想控制3个从属设备(AFE4300车身测量芯片,MCP2515 CAN控制器和8位移位寄存器)。 MCP和移位寄存器应使用USI_A0控制,AFE4300使用USI_B0控制。 当我初始化两个SPI模块时,首先初始化USI_A0,然后初始化USI_B0时出现问题,因此移位寄存器工作不好。 当我注释出AFE4300的init函数或切换顺序时,寄存器工作正常。 我不知道在哪里可以找到问题,可以帮我吗? 两个SPI模块是否可能相互干扰?

这是我的代码:

int main (void)
{
WDTCTL = WDTPW | WDTHOLD; 	//停止看门狗计时

	器IF (CALC1_1MHz == 0xFF || CALDCO_1MHz == 0xFF) //如果校准常量被擦除,则捕获CPU
	{
	while (1);
	}

	BCSCTL1 = CALC1_1MHz; //如果校准常量被擦除。 请勿加载,捕获CPU!
	DCOCTL = CALDCO_1MHz; //为
	
移位寄存器启用设置DCO步进+调制//引脚2_1
P2OUT &=~(BIT1);
P2DIR || BIT1;

	MCP2515_SPI_INIT();
	MCP2515_INIT();//(启动MCP,此处不需要)

AFE4300_SPI_init();
AFE4300_init();

	AFE4300_measurement();

}

void AFE4300_SPI_init(void)
{
P2OUT |= BIT0; //从属选择PIN
P2DIR || BIT0; //从属选择PIN
P1SEL = BIT6 | BIT7 | BIT5; //选择Miso,MOSI,SCK
P1SEL2 = BIT6 | BIT7 | BIT5; //重新配置引脚以将其用于SPI

UCB0CTL1 = UCSWRST; //软件重置启用
UCB0CTL0 |= UCMST + UCMSB + UCCKPH + UCSYNC; //主模式,MSB优先,时钟相位1,3引脚SPI,同步模式(时钟极性0,SPIMODE1)
UCB0CTL1 || UCSSEL_2; // SMCLK作为具有UCSSEL_2位的模块的源时钟
UCB0BR0 |= 0x02; //位时钟预分频器低字节
UCB0BR1 = 0; //位时钟预分频器高字节

UCB0CTL1 &=~UCSWRST; //初始化USCI状态机

}


void AFE4300_init(void)
{

__delay_cycles(day_10ms);

AFE4300_write(BCM_DAC_FREQ, 0x0020); //设置BCM激励电流源的频率(现在:32kHz)
AFE4300_WRITE (MISC1_REGISTER,0x0000);
AFE4300_WRITE (MISC2_REGISTER,0xff);
AFE4300_WRITE (MISC3_REGISTER, 0x0030);
AFE4300_write (device_control_1,0x0006); //主体成分测量前端断电位和前端加电(PDB)
AFE4300_write (device_control_2,0x1800); // IQ_DEMOD_CLK必须是BCM_DAC_FREQ的四倍(IQ_DEMOD_CLK = fCLK /(IQ_DEMOD_CLK_DIV_FAC)= BCM_DAC_FREQ×4)(现在:devider是8)
AFE4300_WRITE (ADC_CONTROL_REGISTER_1,0x41C0); // ADC_DATA_RATE:128 SPS和ADC_PD和ADC_MEAS_MODE:差分(为ADC_CONV_MODE设置第15位)
AFE4300_WRITE (ADC_CONTRAT_REGISTER_2,0x0063); //身体成分测量前端的输出(OUTP_FILT/OUTM_FILT)
AFE4300_WRITE (WEIGHT_STALE_CONTROL,0x0000); //未使用
AFE4300_WRITE (ISW_Matrix,0x0000); //所有开关均打开(内部MUX)
AFE4300_WRITE (VSW_Matrix,0x0000); //所有开关均打开(内部MUX)
AFE4300_WRITE (IQ) MODE_ENABLE,0x800); //为IQ设置位11 (0:全波整流器模式)

__DELAY周期(DELAY) 1ms;

AFE4300_INIT_BCM();//(芯片校准,此处不需要)
}


void AFE4300_measurement()
{
P2OUT &=~BIT1;
MCP2515_SPI_Transmit (0x00);
P2OUT |= BIT1;
P2OUT &=~BIT1;
__delay_cycles (delay_1s);
MCP2515_SPI_Transmit (ELEC_1_2);
P2OUT |= BIT1;
P2OUT &=~BIT1;
__delay_cycles (delay_100ms);
MCP2515_SPI_Transmit (ELEC_2_3);
P2OUT |= BIT1;
P2OUT &=~BIT1;
__delay_cycles (delay_100ms);
MCP2515_SPI_Transmit (ELEC_3_4);
P2OUT |= BIT1;
P2OUT &=~BIT1;
__delay_cycles (delay_100ms);
MCP2515_SPI_Transmit (0x00);
P2OUT |= BIT1;
P2OUT &=~BIT1;

}

作废MCP2515_SPI_INIT(void)
{
P2OUT |= BIT4; //从属选择PIN
P2DIR || BIT4; //从属选择PIN
P1SEL = BIT1 | BIT2 | BIT4; //选择Miso,MOSI,SCK
P1SEL2 = BIT1 | BIT2 | BIT4; //重新配置引脚以将其用于SPI

UCA0CTL1 |= UCSWRST; //重置
UCA0CTL0 |= UCCKPL + UCMSB + UCMST + UCSYNC + UCCKPH; // 3引脚,8位SPI主控
UCA0CTL1 || UCSSEL_2; // SMCLK
UCA0BR0 |= 0x02; ///2...
UCA0BR1 = 0; //

UCA0CTL1 &=~UCSWRST; //初始化USCI状态机

__delay_cycles(delay_100ms);
}


unsigned char MCP2515_SPI_transmit (unsigned char数据)
{
同时(!(IFG2和UCA0TXIFG)); // USI_A0 TX缓冲器就绪?
UCA0TXBUF =数据;
while ( UCA0STAT & UCBUSY );
while (!(IFG2 & UCA0RXIFG)); //收到USI_A0 RX?
返回UCA0RXBUF

;}


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Simon,

    您正在覆盖P1SEL和P1SEL2寄存器。 对于这些赋值,请使用"|="而不是"="。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨,Jace,

    非常感谢! 我是个白痴! :D


    此致,

    西蒙