工具/软件:Linux
大家好,新年快乐!
我将MSP430F5529上的时钟从20MHz更改为24MHz,以便能够使用USB-BSL并具有高频时钟。 从那以后,我似乎无法通过I2C发送数据。 我曾经尝试过使用SMCLK和ACLK将I2C频率提高到12MHz和6MHz,但它似乎不起作用,我以前在20MHz时钟上是否使用了具有SMCLK的10MHz I2C。
这似乎不是电气问题,因为当我恢复到20MHz时钟时,它工作正常。
因此,我请求您的帮助和知识,请帮助:
我使用TI库,我的代码:
Clock.h/c:
#define clock_RATE_MCLK 2400万 #define clock _MS_MCLK 2万 #define clock_rate.SMCLK 1200万 #define clock_rate.ACLK 600万 GPIO _setAsPeripheralModuleFunctionInputPin (XT2_PIN_1); GPIO _setAsPeripheralModuleFunctionInputPin (XT2_PIN_2); //将速度时钟单独设置为UCS章节数据表中授权的速度 UCS_setExternalClockSource (3.2768万,Clock_RATE_MCLK);// XT2=24MHz NO XT1 //设置Vcore以适应允许的最大系统速度 PMM_setVCore (PMM_Core_LEVEL_3); //初始晶体(不是Meth) UCS_turnOnXT2 (UCS_XT2_DRIVE_4MHz_8MHZ);//高频率 UCS_TurnOffXT1(); //使用晶体来设置时钟;时钟越慢,耗电越少 UCS_initClockSignal (UCS_MCLK,UCS_XT2CLK_SELECT,UCS_CLock_diver_1);//时钟为24MHz UCS_initClockSignal (UCS_SMCLK,UCS_XT2CLK_SELECT,UCS_CLock_diver_2);//时钟频率为12MHz UCS_initClockSignal (UCS_ACLK,UCS_XT2CLK_SELECT,UCS_CLock_diver_4);// 6MHz时钟
I2C初始化:
GPIO_setAsPeripheralModuleFunctionOutputPin (pression_sensor_B1); USSCI_B_I2C_initMasterParam; param.selectClockSource = USSCI_B_I2C_CLKSOURCE_ACLK; param.i2cClk = Clock_RATE_ACLK;//6MHz param.datarate = USCI_I2C_USI_B1_B1 ;USCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_B1B1; UB1B1_UB1B1; USCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SCI_SC1B1; U USI_B_I2C_setMode (USI_B1_BASE,USI_B_I2C_Transmit_mode);
USI_B_I2C_DisableInterrupt (USI_B1_BASE,USI_B_I2C_Transmit_Interrupt); USI_B_I2C_DisableInterrupt (USI_B1_BASE,USI_B_I2C_Receive_Interrupt);
I2C发送:
USI_B_I2C_masterSendSingleByte (USI_B1_BASE,DATA); ms_delay (1); USI_B_I2C_clearInterrupt (USI_B1_BASE,USI_B_I2C_Transmit_Interrupt); USI_B_I2C_clearInterrupt (USI_B1_BASE,USI_B_I2C_STOP_INTERRUPT);
TI的驱动器I2C:
Void USI_B_I2C_masterSendSingleByte (uint16_t baseAddress, UINT8_t txData) { //存储当前TXIE状态 UINT8_t txieStatus = HWREG8 (baseAddress + OFS_UCBxIE)& UCTXIE; //禁用传输中断启用 HWREG8 (baseAddress + OFS_UCBxIE)&=~(UCTXIE); //发送启动条件。 HWREG8 (baseAddress + OFS_UCBxCTL1)|| UCTR + UCTXSTT; //传送中断标志轮询。 while (!(HWREG8 (baseAddress + OFS_UCBxIFG)& UCTXIFG)) { ;} //发送单字节数据。 HWREG8 (baseAddress + OFS_UCBxTXBUF)= txData; //传送中断标志轮询。 while (!(HWREG8 (baseAddress + OFS_UCBxIFG)& UCTXIFG)) { ;//此处为BLOOCKED } //发送停止条件。 HWREG8(basAddress + OFS_UCBxCTL1)|= UCTXSTP; //在再次启用中断之前清除传输中断标志 HWREG8 (baseAddress + OFS_UCBxIFG)&=~(UCTXIFG); //恢复传输中断启用 HWREG8(basAddress + OFS_UCBxIE)|= txieStatus; }
谢谢!
奥雷利亚