MSP430讨论区
返回
登录/注册
msp430F5438A 硬件IIC问题请教
楼主
souxwy 于 2015-07-07 20:35:22
msp430F5438A 硬件IIC问题请教
[P]void Init_iic (void)[/P][P]{ [/P][P] P9DIR |=0X06;[/P][P] P9SEL |= 0x06; // Assign I2C pins to USCI_B2[/P][P] UCB2CTL1 |= UCSWRST; // 启用SW复位[/P][P] UCB2CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C主,同步模式[/P][P] UCB2CTL1 = UCSSEL_2 ; // 使用SMCLK[/P][P] UCB2BR0 = 213; // fSCL = SMCLK/12 = ~100kHz[/P][P] UCB2BR1 = 0;[/P][P] UCB2I2CSA = 0x64; // 从地址[/P][P] UCB2CTL1 &= ~UCSWRST; // 清除复位SW,恢复运行[/P][P] UCB2IE |= UCRXIE; // 启用RX中断[/P][P]}[/P][P] [/P][P]/**********************向相关的存储单元写入数据**************************/ [/P][P]void EEPROM_Write(uchar sla,uchar suba,uchar *s,uchar no) [/P][P]{ [/P][P] while (UCB2CTL1 & UCTXSTP); // 确定总线空闲 [/P][P] UCB2CTL1 |= UCTXSTT + UCTR; // 发送起始位,确定为发送模式 [/P][P] UCB2TXBUF = (sla); // 发送高位地址 [/P][P] while((UCB2IFG & UCTXIFG)==0); // 判断是否发送完毕 [/P][P] UCB2TXBUF = (suba); // 发送低位地址 [/P][P] while((UCB2IFG & UCTXIFG)==0); // 判断是否发送完毕 [/P][P] UCB2TXBUF = (*s); // 发送数据 [/P][P] while((UCB2IFG & UCTXIFG)==0); // 判断是否发送完毕 [/P][P] UCB2CTL1 |= UCTXSTP; // 发送停止位 [/P][P] while((UCB2CTL1 & UCTXSTP)==1); // 判断停止位是否发送完毕 [/P][P]} [/P][P] [/P][P]/***********************字节读函数 连续读发送设置 *********************************/ [/P][P]void EEPROM_read() [/P][P]{ [/P][P] UCB2CTL1 &= ~UCTR; // 确定为读 [/P][P] while (UCB2CTL1 & UCTXSTP); // 总线是否空闲 [/P][P] UCB2CTL1 |= UCTXSTT; // 发送开始位 [/P][P]} [/P][P] [/P][P]/*******************字节写函数 **********随机读发送设置 *************************/ [/P][P]void EEPROM_radom(unsigned char high_Address,unsigned char low_Address) [/P][P]{ [/P][P] while (UCB2CTL1 & UCTXSTP); // Ensure stop condition got sent [/P][P] UCB2CTL1 |= UCTXSTT + UCTR; // 发送起始位,确定为写 [/P][P] UCB2TXBUF = high_Address; // 发送地址位高位 [/P][P] while((UCB2IFG & UCTXIFG)==0); // 判断是否发送完毕 [/P][P] UCB2TXBUF = low_Address; // 发送地址位低位 [/P][P] while((UCB2IFG & UCTXIFG)==0); // 判断是否发送完毕 [/P][P] UCB2CTL1 &= ~UCTR; // 确定为接收 [/P][P] while (UCB2CTL1 & UCTXSTP); // 判断总线是否被释放 [/P][P] UCB2CTL1 |=UCTXSTT; // 重新发送起始位 [/P][P] while((UCB2CTL1 & UCTXSTT)==1); // 判断起始位是否发送成功 [/P][P] for(unsigned char i=0x0;i<0x2f;i++); // 延时确定数据已经被发送出去 [/P][P] UCB2CTL1 |=UCTXSTP + UCTXNACK; // 发送停止位和NACK位 [/P][P]} [/P][P] [/P][P]/********************接收中断函数 **********存取接收的数据 ******************************/ [/P][P]#pragma vector = USCI_B2_VECTOR [/P][P]__interrupt void USCIAB2_ISR(void) [/P][P]{ [/P][P] if(UCB2IFG & UCRXIFG) // 接收中断 [/P][P] { [/P][P] count++; [/P][P] RXData = UCB2RXBUF; [/P][P] } [/P][P]} [/P][P]
[/P][P]
[/P][P]
[/P][P]
[/P][P]
[/P][P]程序一直会在[SIZE=9pt]while((UCB2IFG & UCTXIFG)==0); 过不去。求大神速帮忙分析下。[/SIZE][/P]
回复
1楼
DC 于 2015-07-08 15:39:17
你是全速进行调试还是单步调试?
如果是单步仿真的话,IIC是无法让你在这些微小的时序当中让等待的查看的。[P]如果是全速运行卡在这里可能需要另找原因了。[/P]
回复
1
电脑版
Page created in 0.2500 seconds width 3 queries.