主题中讨论的其他器件: MSP430F5438A
我有在 UCB0上使用 MSP430F5438A 微控制器的先前设计中运行的 I2C 代码。 我们切换到 MSP430F5659、我需要移至端口8引脚5和6上的 UCB1模块。 我作为主器件运行、在这些端口引脚上什么也没有。 电路板上有外部上拉电阻器、两条线路都始终处于高电平。 I2C 例程正在轮询、因此不使用中断。
我尝试使用相同的代码切换到 UCB0模块、但它工作正常...返回 UCB1、但仍然没有任何结果。 是否有任何关于它为什么不起作用的想法? 我是否缺少关于端口8的奇数?
下面是我的 I2C 例程...
空初始化 I2C (空)
{
P8SEL |= BIT6;//启用 SCL 引脚
P8SEL |= BIT5;//启用 SDA 引脚
UCB1CTL1 |= UCSWRST;//将串行控制器保持在复位状态
UCB1CTL0 &=~UCSLA10;// 7位从地址
UCB1CTL0 &=~UCMM;//单主环境
UCB1CTL0 |= UCMST;//主控模式
UCB1CTL0 |= UCMODE_3;// I2C 模式
UCB1CTL0 |= UCSYNC;//同步模式
UCB1CTL1 |= UCSSEL_1;//为时钟源选择 ACLK
UCB1BR0 =(I2C_CLOCK 预分频器和0xFF);//时钟预分频器的 LSB
UCB1BR1 =(I2C_CLOCK 预分频器>> 8);//时钟预分频器的 MSB
UCB1CTL1 &=~Ω UCSWRST;//解除串行控制器复位
}
char I2CsendBytes (char 地址、char* txBuffer、char numBytes)
{
char bytesSent;//计算发送的字节数
char errorCode;//保留要返回的错误代码
错误代码= 0;//将错误代码预设为无错误
UCB1CTL1 |= UCTR;//设置为发送器模式
UCB1IFG &=~UCTXIFG;//清除 USCI_B1 TX 内部标志
UCB1I2CSA =地址;//加载地址字节
超时= 0;//初始化超时计数器
while (((UCB1CTL1 & UCTXSTP)&&(!errorCode))//等待停止位发生
{
if (超时> I2C_SEND_TIMEOUT)
{
错误代码= I2C_RX_TIMEOUT_1;
}
}
UCB1CTL1 |= UCTXSTT;//发送开始条件
字节 Sent = 0;//初始化计数器
while (bytesSent < numBytes)
{
超时= 0;//初始化超时计数器
while ((((UCB1IFG & UCTXIFG)=0)&&(!errorCode)//等待发送缓冲区准备就绪
{
IF (UCB1IFG 和 UCNACKIFG)
{
错误代码= I2C_Nack_received;
}
if (超时> I2C_SEND_TIMEOUT)
{
错误代码= I2C_TX_TIMEOUT_1;
}
}
UCB1IFG &=~UCTXIFG;//清除 USCI_B0 TX 内部标志
UCB1TXBUF = txBuffer[bytesSent];//加载数据字节
字节 Sent++;//递增发送的字节计数器
}
while ((((UCB1IFG & UCTXIFG)=0)&&(!errorCode)//等待发送缓冲区准备就绪
{
if (超时> I2C_SEND_TIMEOUT)
{
错误代码= I2C_TX_TIMEOUT_2;
}
}
UCB1IFG &=~UCTXIFG;//清除 USCI_B0 TX 内部标志
if (错误代码)
{
UCB1CTL1 |= UCSWRST;//将串行控制器保持在复位状态
UCB1CTL1 &=~Ω UCSWRST;//解除串行控制器复位
}
其他
{
UCB1CTL1 |= UCTXSTP;//发送停止条件
}
退货错误代码;
}