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:在具有interruprt的SDIO行中不发生响应

Guru**** 2609955 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/660322/ccs-msp430g2553-response-doesnt-occur-in-the-sdio-line-with-interruprt

部件号:MSP430G2553

工具/软件:Code Composer Studio

您好,

我正在对i4721进行编程,而不是i2c。 将命令写入si4721时没有错误。 但是当我想阅读si4721的回应时,我从未经历过这样的事情。 下面是读取和写入代码部分。

void i2c_tX_init (void){
	__disable_interrupt ();
	i2c_comm_type ='T'; // i2c传输模式
	IE2 &=~UCB0RXIE;
	while (UCB0CTL1和UCTXSTP); //确保停止条件已发送//禁用RX中断
	UCB0CTL1 || UCSWRST; //启用软件重置
	UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C主控,同步模式
	UCB0CTL1 = UCSSEL_2 + UCSSWRST; //使用SMCLK,保持软件重置
	UCB0BR0 =12; // fSCL = SMCLK/12 =~100kHz
	UCB0BR1 = 0;
	UCB0I2CSA = i2c_address; //从属地址
	UCB0CTL1 &=~UCSWRST; //清除软件重置,恢复操作
	IE2 |= UCB0TXIE; //
	启用TX中断,同时(UCB0CTL1和UCTXSTP); //确保停止条件已发送
	UCB0CTL1 || UCTR + UCTXSTT; // I2C tx,启动条件
}

void i2c_rx_init (void){__disable_interrupt()
	;
	i2c_comm_type ='R'; // i2c接收模式
	IE2 &=~UCB0TXIE;
	UCB0CTL1 |= UCSWRST; //启用软件重置
	UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C主控,同步模式
	UCB0CTL1 = UCSSEL_2 + UCSSWRST; //使用SMCLK,保持软件重置
	UCB0BR0 =12; // fSCL = SMCLK/12 =~100kHz
	UCB0BR1 = 0;
	UCB0I2CSA = i2c_address; //从属地址
	UCB0CTL1 &=~UCSWRST; //清除软件重置,恢复操作
	IE2 |= UCB0RXIE; //
	启用RX中断,同时(UCB0CTL1和UCTXSTP); //确保停止条件已发送
	UCB0CTL1 || UCTXSTT; // I2C启动条件
}

void write_si4721(void){ //将寄存器写入si4721并读取
	i2c_init();
	__bis_sr_register (CPUOFF + GIE);
	__delay_cycles(200);//			等待缓冲区清空
	i2c_rx_init();
	__bis_sr_register(CPUOFF + GIE);

}

#pragma vector = USCIAB0TX_vector
__interrupt void USCIAB0TX_ISR(void){
	IF(i2c_comm_type =='T'){ // i2c传输模式
		if (transmit_arg_number){
			Transmit_arg_number--;
			IFG2 &=~UCB0TXIFG; // clear USI_B0 tx int flag
			UCB0TXBUF = si4721_write_packet[transmit_arg_number];
		}
		else {
			UCB0CTL1 |= UCTXSTP; // I2C停止条件
			IFG2 &=~UCB0TXIFG; // Clear USI_B0 TX int flag
			__BIC_SR_REGISTER_ON_EXIT (CPUOFF + GIE); //如果数据为
		}则退出LPM0
	
	,否则为(i2c_comm_type =='R'){ // i2c接收模式
		__delay_cycles(500);
		if (response_packet_number){ //检查RX字节计数
			器si4721_read_packet[si4721_read_packet_lenth -4721 - Response_packet_number]= UCB0RXBUF;
													//获取RX数据
			Response_packet_number--
		;}
		else{
			UCB0CTL1 || UCTXSTP; //不重复启动:停止条件
			IFG2 &=~UCB0RXIFG; // Clear USI_B0 TX int flag
			__BIC_SR_REGISTER_ON_EXIT (CPUOFF + GIE); //如果数据为
		}
	
,则退出LPM0 }} 

如果我没有在“2c_rx_init();”行后设置断点,则i2c行上的信号为:

但如果我在“i2c_rx_init();”行后设置断点,则i2c行:

si4721的响应应该是0x80。 从si4721接收数据时出现什么问题? 我需要做什么? 到目前为止,我尝试了延迟,但没有得到正确的回应。

此致。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我注意到,在“i2c_rx_init();”之后,数据被加载到rx缓冲区。 但如果我从"__bis_sr_register (CPUOFF + GIE)"行中走一步,Rx缓冲区将自动清除,其值为0x00。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Recep您好!

    要启动i2c_rx_init,应清除UCB0TXIE,清除UCTR,并重置Response_packet_number的值。 如果正确使用了LPM0和标志循环,则不需要设置的延迟。

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

    您好Ryan:

    感谢您的回复。 我删除了延迟行,但问题仍然存在。 您所说的设置已在我的功能中实现。 但我还是在寄存器设置中检查了它们。 结果如下:

    为了清楚地说明,我添加了rxbuf问题。

    从上面的两张图片中可以看出,Rx buf在我读之前获得0x00值。

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

    Response_packet_number重置如何? ISR读取UCB0RXBUF的值,然后在发送停止位并退出LPM0以恢复主代码操作之前清除该值。 您强调的行为似乎恰当。

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

    感谢您的快速回复。 发送开始条件前,Response_packet_number设置为1。 调试时,我注意到,如果在i2c_rx_init函数的发送开始连接行上设置一个点,我可以读取Rx缓冲区并将其设置为数组元素。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    si4721_read_packet数组是否曾被指定为RXBUF值? 您应该进一步调试RX ISR,以确保其按预期运行。

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

    您好,

    是的,已设置为预期值。 我在i2c_rx_init()的每一行都设置了断点。 然后从i2c中读取数据正常。 正如我所知,断点会停止特定行上的代码。 因此我无法理解为什么在不设置断点的情况下我的代码无法读取。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试添加while (UCB0CTL1和UCTXSTP);以确保在输入i2c_rx_init()之前发送停止条件;并根据需要重新评估msp430g2xxS 3_uscib0_i2c_12.c。

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

    ı 添加 while (UCB0CTL1和UCTXSTP);行。 另外,从您提到的示例中,我还添加了一些行。 以下是更新的代码。

    void i2c_tX_init (void){
    	__disable_interrupt ();
    	i2c_comm_type ='T'; // i2c haberleşmesi发射modunda
    	IE2 &=~UCB0RXIE;							//
    	禁用接收中断,同时(UCB0CTL1 & UCTXSTP); //确保停止条件已发送
    	UCB0CTL1 || UCSWRST; //启用软件重置
    	UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C主控,同步模式
    	UCB0CTL1 = UCSSEL_2 + UCSSWRST; //使用SMCLK,保持软件重置
    	UCB0BR0 =12; // fSCL = SMCLK/12 =~100kHz
    	UCB0BR1 = 0;
    	UCB0I2CSA = i2c_address; //从属地址
    	UCB0CTL1 &=~UCSWRST; //清除软件重置,恢复操作
    	IE2 |= UCB0TXIE; //
    	启用TX中断,同时(UCB0CTL1和UCTXSTP); //确保停止条件已发送
    	UCB0CTL1 || UCTR + UCTXSTT; // I2C TX,启动条件
    	__bis_sr_register (CPUOFF + GIE); /*进入低功耗模式4*/
    	同时(UCB0CTL1和UCTXSTP); //确保已发送停止条件
    
    }
    
    void i2c_rx_init (void){__disable_interrupst()
    	;
    	i2c_comm_type ='R'; // i2c haberleşmesi接收模块unda
    	IE2 &=~UCB0TXIE;
    	UCB0CTL1 |= UCSWRST; //启用软件重置
    	UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C主控,同步模式
    	UCB0CTL1 = UCSSEL_2 + UCSSWRST; //使用SMCLK,保持软件重置
    	UCB0BR0 =12; // fSCL = SMCLK/12 =~100kHz
    	UCB0BR1 = 0;
    	UCB0I2CSA = i2c_address; //从属地址
    	UCB0CTL1 &=~UCSWRST; //清除软件重置,恢复操作
    	IE2 |= UCB0RXIE; //启用RX中断
    同时(UCB0CTL1和UCTXSTP); //确保停止条件已发送
    	UCB0CTL1 || UCTXSTT; // I2C启动条件
    期间(UCB0CTL1和UCTXSTT); //开始条件已发送?
    IF (Response_packet_number == 1){
    		UCB0CTL1 || UCTXSTP; // son okunacak paketten önce stop cond. gönder
    		Response_packet_number = 0;
    }
    __bis_sr_register (CPUOFF + GIE); /*进入低功耗模式4*/
    	同时(UCB0CTL1和UCTXSTP); //确保已发送停止条件
    
    } 
    #pragma vector = USCIAB0TX_vector
    __interrupt void USCIAB0TX_ISR(void){
    	IF(i2c_comm_type =='T'){ // i2c传输模式
    		if (transmit_arg_number){ //命令ve arg sayısı kadar byte gönder
    			transmit_arg_number--;
    			IFG2 &=~UCB0TXIFG; // clear USI_B0 tx int flag
    			UCB0TXBUF = si4721_write_packet[transmit_arg_number];
    		}
    		else {
    			UCB0CTL1 |= UCTXSTP; // I2C停止条件
    			IFG2 &=~UCB0TXIFG; //清除USI_B0 TX int flag
    			__BIC_SR_REGISTER_ON_EXIT (CPUOFF);		/*退出低功耗模式4 */
    		}
    	
    	else if (i2c_comm_type =='R'){ // i2c接收模块
    		if (Response_packet_number >1){
    			Response_packet_number--;
    			si4721_read_packet[Response_packet_number]= UCB0RXBUF;//获取RX数据
    		}
    		else {
    			si4721_read_packet[Response_packet_number]= UCB0RSTP UF;//获取RX数据
    			包= UCT0RC10= UCT1= UCT1= UCT1= UCT1=数据包
    				// son okunacak paketten önce stop cond. gönder
    				Response_packet_number--;
    			}
    			else if (Response_packet_number ==0){
    				IFG2 &=~UCB0RXIFG; //清除USI_B0 TX int flag
    				__BIC_SR_REGISTER_ON_EXIT (CPUOFF;		/*退出低功耗模式4*/
    			}}}
    

    如果不设置断点,仍然无法读取si4721的响应。 线路上的信号低于。

    信号看起来合适,但响应“0x00”不正确。 如果设置断点,我将从缓冲区中获取“0x80”并将其设置为数组元素。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我决定设置断点。 然后我注意到,在第一次交易后,我不需要断点。 但我不知道第一笔交易的问题是什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否调查过这可能是硬件问题还是从属设备的计时/寄存器依赖性?

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    时间方面看不到任何信息。 但是我试图在通过i2c发送值后延迟一些时间。 然后它就能工作了。 感谢您的支持Ryan。