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/MSP432P401R:CCS中的I2C与Keil不同

Guru**** 2539500 points
Other Parts Discussed in Thread: TCA9535

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/635310/ccs-msp432p401r-i2c-in-ccs-is-different-from-keil

部件号:MSP432P401R
主题中讨论的其他部件:TCA9535

工具/软件:Code Composer Studio

出于某种原因,我不得不将IDE从Keil更改为CCS,我发现当我在Keil中使用软件i2c时,经过一个读取过程后,它将长时间停止,但在CCS中却没有停止。 由于 两个读取过程之间的中断过短,CCS可能导致读/写错误。

下图显示了该问题:

Keil:

首次读取后耗时超过100毫秒。

一读:

二读:

CCS:

它在一读后进行了二读,它只是中断了几次,我设置为延迟。

我不知道为什么,我应该在CCS中设置一些编译段落或什么? 谢谢。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否发送您正在使用的主/从软件,或者让我知道,如果您正在使用SimpleLink SDK中的示例,这是哪个示例?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob,您好,我正在使用IO模拟i2c,就像这样

    Void I2C_SendByte (C_U32 A_u32SclPort,C_U32 A_u32SclPin,C_U32 A_u32SDaPort,C_U32 A_u32SDAPIN,C_U8 A_u8Data)
    {
    C_U8 I = 0;
    
    SCL_LOW (a_u32SclPort,a_u32SclPin);
    
    (i = 0;i < 8;i ++)
    {
    (a_u8Data和0x80)? SDA_HIGH (a_u32SDaPort,a_u32SDaPin):SDA_LOW (a_u32SDaPort,a_u32SDaPin);
    DELAY (DELAY);//***
    scl_high (a_u32SclPort,a_u32SclPin);
    DELAY (DELAY)(延迟)_MS);
    DELAY (DELAY);//***
    SCL_LOW (a_u32SclPort,a_u32SclPin);
    DELAY (DELAY)(延迟)_MS);
    a_u8Data <<=1;
    }
    } 
    静态空TCA9535_Write (ST_TCA9535* a_pstTCA9535,C_U8 a_u8RegAddr,C_U8 a_u8RegData)
    {
    
    	I2C_Start (SCL_Port,SCL_PIN,SDA_Port,SDA_PIN);
    
    
    	I2C_SendByte (SCL_Port, SCL_PIN,SDA_port,SDA_PIN,a_pstTCA9535->m_DevAddrW);
    	IF (!I2C_CheckAck (SCL_port, SCL_PIN,SDA_port,SDA_PIN))
    {
    I2C_Stop (SCL_port,SCL_PIN,SDA_port,SDA_PIN);
    printf ("错误:%s,%d,addr:%x\r\n",__file__,__line__,a_pstTCA9535->m_DevAddr>1>1);
    返回;}
    
    
    
    I2C_SendByte (SCL_port,SCL_PIN,SDA_port,SDA_PIN,a_u8RegAddr);
    	如果(!I2C_CheckAck (SCL_port,SCL_PIN,SDA_port,SDA_PIN))
    {
    I2C_Stop (SCL_port,SCL_PIN,SDA_port,SDA_PIN);
    printf ("错误:%s,%d,addr:%x\r\n",__file__,__line__,a_pstTCA9535->m_DevAddr>1>1);
    返回;}
    
    
    /*数据*/
    I2C_SendByte (SCL_port,SCL_PIN,SDA_port,SDA_PIN,a_u8RegData);
    	如果(!I2C_CheckAck (SCL_port,SCL_PIN,SDA_port,SDA_PIN))
    {
    I2C_Stop (SCL_port,SCL_PIN,SDA_port,SDA_PIN);
    printf ("错误:%s,%d,addr:%x\r\n",__file__,__line__,a_pstTCA9535->m_DevAddr>1>1);
    返回;}
    
    
    
    	I2C_Stop (SCL_port,SCL_PIN,SDA_port,SDA_PIN);
    } 

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

    您尝试使用软件驱动方法而不是使用I2C外设和driverlib代码来执行此操作是否有原因? 我首先看一下我们在资源管理器中的I2C示例。 我将从下面的主/从对开始:

    I2C_MASTER_w_multibyte-slaver_code

    I2C_MASTER_w_multibyte-MASTER_CODE

    此致,

     Bob

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

    首先,我尝试使用光传感器中的演示代码从TCA9535读取数据,就像这样  

    const eUSI_I2C_MasterConfig i2cConfig =
    {
    EUSCI_B_I2C_CLOCKSOURCE_SMCLK, // SMCLK时钟源
    2400万, // SMCLK = 48MHz
    EUSCI_B_I2C_SET_DATA_RATE_100KBPS, //所需的I2C时钟为100kHz
    0, //无字节计数器阈值
    EUSCI_B_I2C_NO_AUTO_STOP //无自动停止
    };
    
    静态void TCA9535_Write(ST_TCA9535* a_pstTCA9535,9535 a_pstTCA9535, C_U89535 C_U8 a_u8RegAddr , C_U8 a_u8RegData){/*
    
    
    指定
    
    	
    
    Interinterrupt address for I2C_setSlaveAddress(I2C_SCI_B3_base, a_pst_a_ut8 a_utr8_utr8_utb3_I2C_DEF_I2C_DEF_I2C_DEB3_STB3_STB3_STB3;
    
    	
    
    
    
    	传输模式EDE_DE_DEF_I2C_DEB3_DEB3_DEF_EDEF_EDEB3_DEB3_DEB3_EDEF_I2I2I2I2C_DEF_I2C_DE_I2C_DEB3_DEB3_ST_DEB3_DEF_DEB3_
    
    /*清除任何现有的中断标志PL */
    I2C_clearInterruptFlag (EUSI_B3_BASE,
    	EUSI_B_I2C_Transmit_INTERRUPT0);
    
    /*等待准备好写入PL */
    while (I2C_isBusy (EUSI_B3_BASE));
    
    
    /*启动启动并发送第一个字符*/
    I2C_masterSendMultiByteStart(EUSI_B3_base,
    	a_u8RegAddr);
    
    While (!I2C_getInterruptStatus(EUSI_B3_base,
    EUSCI_B_I2C_STOP_INTERRUPT);
    	
    I2C_masterSendMultiByteFinish (EUSI_B3_BASE,
    	A_u8RegData);
    	While (!I2C_getInterruptStatus (EUSI_B3_BASE,
    EUSCI_B_I2C_STOP_INTERRUPT);
    }
    
    静态void TCA9535_READ (ST_TCA9535* a_pstTCA9535,C_U8 a_u8RegAddr,C_U8* a_u8RegData)
    {/*
    	
    	指定I2C_setSlaveAddress (EUSCI_IB3_STB3_STB3_INTERSTREB0
    	
    		
    	
    	,I2C_DELASTB3_ETC0_STB3_STB3_INTERSTB3_STB3_INTERSTB0,
    	
    		EDE0
    
    
    /*将主中继器设置为传输模式PL */
    I2C_setMode (EUSI_B3_BASE,
    EUSCI_B_I2C_Transmit_mode);
    
    /*清除任何现有中断标志PL */
    I2C_clearInterruptFlag (EUSI_B3_BASE,
    EUSCI_B_I2C_Transmit_INTERRUPT0);
    
    /*等待准备好写入PL */
    While (I2C_isBusBusy (EUSCI_B3_BASE));
    
    /*启动开始并发送第一个字符*/
    I2C_masterSendMultiByteStart (EUSCI_B3_base,a_u8RegAddr);
    
    /*等待TX完成*/
    while (!(I2C_getInterruptStatus (EUSCI_B3_BASE),
    EUSCI_B_I2C_Transmit_INTERRUPT0));
    
    /*仅启动停止*/
    I2C_masterSendMultiByteStop (EUSI_B3_BASE);
    
    /*等待停止完成*/
    while (!I2C_getInterruptStatus (EUSCI_B3_BASE,
    EUSCI_B_I2C_STOP_INTERRUPT);
    
    /*
    *生成启动条件并将其设置为接收模式。
    *这将发送从属地址并继续读取
    *直到您发出停止
    */
    		*a_u8RegData = I2C_masterReceiveSingleByte (EUSI_B3_base);
    //I2C_masterReceiveStart (EUSCI_B3_BASE);
    
    /*等待RX缓冲区填充*///
    while (!(I2C_getInterruptStatus (EUSI_B3_BASE,
    // EUSCI_B_I2C_Receive_INTERRUPT0));
    
    /*接收第二个字节然后发送停止条件*//*a_u8RegData
    = I2C_masterReceiveMultiByteFinish(EUSI_B3_base);
    	
    }
    
    void TCA9535_Init(ST_TCA9535* a_pstTCA9535,9535 a_pstTCA9535, C_U89535 C_U8 a_u8DevAddr)
    {
    a_pstTCA9535->m_DevAddrW =(a_u8DevAddr <<1)| 0;// Addr + Write
    a_pstTCA9535->m_DevAddrR =(a_u8DevAddr << 1)| 1;// Addr +读取
    a_pstTCA9535->m_DevAddr = a_u8DevAddr;
    	
    GPIO_setAsPeripheralModuleFunctionOutputPin (
    SCL_port,
    SCL_PIN,
    GPIO辅助模块功能);
    
    GPIO_setAsPeripheralModuleFunctionOutputPin (
    SDA_port,
    SDA_PIN,
    GPIO _secondal_module_function);
    
    			/*初始化USI_B0和I2C主控器以与从属设备进行通信*/
    	I2C_initMaster(EUSI_B3_base,&i2cConfig);
    	
    	/*禁用I2C模块以进行更改*/I2C_DisableModule(EUSCI_B3_base)
    	;
    	
    	/*启用I2C模块以开始操作*/I2C_enableModule*(EI2C_SCL/ 6.5 6.4
    	
    	
    

     它将卡在中  

    While (I2C_isBusBusy (EUSCI_B3_BASE));
    因为UCBBUSY是Alwasy设置。
    我发现UCBBUSY是在我执行I2C_enableModule(EUSSCI_B3_base)后立即设置的;
    从不重置,但我尚未开始发送字节。

    第二个原因是我正在使用另一个i2c与将切换SCL和sda的设备通信,这意味着,如果我读或写错误,我将切换SCL和sda并重试,
    所以我使用软件驱动。为了方便起见,我在与TCA9535通信时也使用了这种方法。

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

    问题似乎已在此帖子中得到解答,因此请关闭此处的线程。