主题中讨论的其他器件: MSP430FR2111
工具/软件:Code Composer Studio
大家好、
本指南 www.ti.com/.../slaa703.pdf 中的“Software I²C (软件)”出现问题 。 当我在 MSP430FR2311上执行时、它会在调用 timer_iteration()后进入 ISR 陷阱(有时它会循环并在进入陷阱之前多次调用此函数)。
我已将计时器更改为使用计时器 B (因为 MSP430FR2311没有计时器 A)、并保持引脚不变(软件 I²C 使用我所需的引脚)。
我的 main.c 如下所示:
#include #include #include #include "msp430_swi2c_master.h" void main (void) { WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器 PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式 //激活先前配置的端口设置 //根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态 //在配置时钟系统之前在8MHz 以上运行。 FRCTL0 = FRCTLPW | NWAITS_1; _bis_SR_register (SCG0); //禁用 FLL CSCTL3 |= SELREF_REFOCLK; //将 REFO 设置为 FLL 基准源 CSCTL0 = 0; //清除 DCO 和 MOD 寄存器 CSCTL1 &=~(DCORSEL_7); //首先清除 DCO 频率选择位 CSCTL1 |= DCORSEL_5; //设置 DCO = 16MHz CSCTL2 = FLLD_0 + 487; // DCOCLKDIV = 16MHz _DELAY_CYCLES (3); _BIC_SR_register (SCG0); //启用 FLL while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1)); // FLL 锁定 CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK; //将默认 REFO (~32768Hz)设置为 ACLK 源,ACLK = 32768Hz //默认 DCOCLKDIV 为 MCLK 和 SMCLK 源 SWI2C_I2CTransaction myTransaction; uint8_t myBuffer[1]={0xFF}; /*初始化主设备*/ SWI2C_initI2C(); /*设置事务*/ myTransaction.address = 0x38; myTransaction.writeBuffer = myBuffer; myTransaction.numWriteBytes = 1; if (!SWI2C_performI2CTransaction (&myTransaction)) { /*此处处理错误代码*/ } while (1); }
代码挂起的部分位于 MSP430_swi2c_master.c 中
/*循环读取、直至所有位均已读取*/ 操作 { /*为临时变量添加初始值并发送时钟脉冲*/ temp =(temp << 1); SWI2C_SCL_HIGH; timer_iteration(); /*如果数据线为高电平,则记录该*/ IF (SWI2C_PxIN 和 SWI2C_SDA) { temp += 1; } /*发送另一个时钟周期并递减计数器*/ 位=(位- 1); SWI2C_SCL_LOW; timer_iteration(); }
我已经尝试将堆栈大小增加到1000kB (几乎整个 RAM)、但没有成功。 此外、我已经尝试修改 MSP430FR2111的源代码(可在本指南 http://www.ti.com/lit/an/slaa714/slaa714.pdfd 上找到)、结果是一样的。 是否缺少其他配置?