主题中讨论的其他部件: MSP430G2553
我正在使用 资源管理器中的代码示例- 3.60。00.10
两个文件描述了如何将char数组从I2C从属设备传输到I2C主设备。
文件名是。
MSP430F55xx_uscib0_i2c_10.c 从属设备传输到主设备
MSP430F55xx_uscib0_i2c_11.c 主设备接收来自从属设备的传输。
我正在使用代码沉稳6.0 来调试此代码。 我有两个设备通过WFP 3.0 和3.1 连接 ,两个针脚上都有10K电阻。
我实际上让主中继器传输到了从控制器...这是一场噩梦,但我的代码有效...现在我需要让从控制器传输到主控制器。
代码示例相当糟糕,因为我根据使用示例代码创建主中继到从属传输的经验确定...但我无法使用这个新代码。
问题是从属设备和主设备都卡在interrupt....nothing上。
以下是两个代码:再次直接从示例中输入。 为什么从属设备和主设备都在中断时挂起?
(请注意,我从此帖子中删除了文案标题,以减少读取全部内容的需要,但TI代码受其文案保护。)
从属代码- 传输至主中继器
//************************************************************************************************
////
从代码
//-从传输到主中继
器////
这是从MSP430F55xx_uscib0_i2c_11.c
//******************************************************************************************************复制的
#include <MSP430-h>
unsigned char *PTxData;//指向TX数据
的指针指向unsigned char TxData[]=//要传输
的数据表{0x11,
0x22,
0x33,
0x44,
0x55};
Int main (void)
{
WDTCTL = WDTPW + WDTHOLD;//停止WDT
P3SEL |= 0x03;//将I2C引脚分配给USI_B0
UCB0CTL1 || UCSWRST;//启用软件重置
UCB0CTL0 = UCMODE_3+ UCSYNC;// I2C从属,
COA和UCBI1= UCS048H; UCS1= UCBI0
~UCBI0 //清除软件重置,恢复操作
UCB0IE |= UCTXIE + UCSTPIE + UCSTTIE;//启用STT和STP中断
//启用TX中断
,同时(1){
PTxData =(unsigned char *)TxData;//启动TX缓冲区
__bis_sr_register (LPM0_Bits + GIE); //输入LPM0,启用中断
//保留在LPM0中,直到主
//完成RX
__NO_OPEX();//设置断点>>此处<<和
}//读取TXByteCtr计数
器}//------------------
// USI_B0数据ISR TX矢量用于将数据从MSP430存储器移动到
// I2C主控制器。 TxData指向要传输
的下一个字节,TXByteCtr //跟踪传输的字节数。
//------------------
//------------------
// USI_B0状态ISR TX向量用于从LPM0唤醒CPU,以便
//在数据传输后在主程序中进行处理。 LPM0仅在
传输实际数据//时出现(重新)启动或停止条件时退出。
//------------------
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector = USI_B0_vector
__interrupt void USI_B0_ISR(void)
#Elif defined(__GISR__)
void __attribute__(interrupt (USCI_B0_vector))#USI_void
#endif
{
SWITCH(__EIV_IN_RANGE(UCB0IV,12))
{
案例0:中断;//矢量0:无中断
案例2:中断;//矢量2: ALIFG
案例4:中断;//矢量4: NACKIFG
案例6://矢量6: STTIFG
UCB0IFG &=~UIFG
案例8:中断
/矢量8: STPIFG
UCB0IFG &=~UCSTPIFG;//清除停止条件int标志
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//如果数据传输
中断,则退出LPM0;
案例10:中断;//矢量XB10:RXIFG
案例12://传输矢量
UCB0TxUF+;
错误
地址:传输数据
主代码
//************************************************************************************************
////
主码
//-主中继器接收从设备发出的数据
////这
是从MSP430F55xx_uscib0_i2c_10.c
////****************************************************************************************************************************************************************************************************************************************************************复制
#include <MSP430.h>
unsigned char *PRxData;//指向RX data
unsigned char RXByteCtr的指针;
volatile unsigned char RxBuffer[128];//分配128字节的RAM
int main(void)
{
WDTCTTL = WDTPW + WDTHOLD;//停止WDT
P3SEL |= 0x03;//将I2C引脚分配给UCTSCI_B0
;UCS1; //启用SW RESET
UCB0CTL0 = UMST + UCMODE_3 + UCSYNC;// I2C主控,同步模式
UCB0CTL1 = UCBEL_2 + UCSWRST;//使用SMCLK,保持SW reset
UCB0BR0 = 12;// fSCL = SMCLK/12 =~100kHz CSSWR1 =
UCS0ST/ UCS0ST
~0 //清除软件重置,恢复操作
UCB0IE |= UCRXIE;//
在下列情况下启用RX中断:(1){
PRxData =(unsigned char *)RxBuffer;//启动RX缓冲区
RXByteCtr =5;//
加载RX字节计数器,同时(UCB0CTL1和UCTXSTSTP);//确保发送停止条件
UCB0CTXL1;| UCTXST1= // I2C起始条件
__bis_sr_register(LPM0_bits + GIE);//输入LPM0,启用中断
//保留在LPM0中,直到所有数据
//都是Rx'd
__no_operation();//设置断点>>此处<<和
}//读出RxBuffer缓冲区
}//------------------
// USI_B0数据ISR用于将接收到的数据从I2C从
//移动到MSP430存储器。 它的结构使其可以通过
预加载带字节计数的RXByteCtr来接收//任意2+个字节。
//------------------
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector = USI_B0_vector
__interrupt void USI_B0_ISR(void)
#Elif defined(__GISR__)
void __attribute__(interrupt (USCI_B0_vector))#USI_void
#endif
{
SWITCH(__even_in_range(UCB0IV,12))
{
案例0:中断;//矢量0:无中断
案例2:中断;//矢量2:ALIFG
案例4:中断;//矢量4:NACKIFG
案例6:中断;//
按6:STTIFG案例8:中断;//矢量RXPIFG案例8:STP- // Decrement RX byte counter
IF (RXByteCRO)
{
*PRxData+= UCB0RXBUF;// Move RX data to address PRxData
if (RXByteCtr ==1)// only one byte left ?(如果RXByteCtr ==1,则将RX数据移动到PRxData?)
UCB0CTL1 |= UCTXSTP;//生成I2C停止条件
}
否则
{
*PRxData = UCB0RXBUF;//将最终RX数据移至PRxData
__BIC_SR_REGISTER_ON_EXIT(LPM0_bits);//退出活动CPU
}
中断;
情况12:中断;//矢量12:TXIFG
默认
值:中断}