主题中讨论的其他器件: MSP430F169、 MSP430FR2422
您好...
我还有一个问题。 在 MSP430F2012中、我已对 I2C 从设备应用程序进行了编程。 I2C 总线上连接更多器件。 当主器件提示从器件进行数据传输时、在传输后、2012从器件始终处于 I2C 中断状态。 任何操作都无法停止此中断、程序处于无限循环中。 我可以做什么来停止无限循环。 我使用了 TI 的一个示例:msp430x20x3_USI_09.s43。
此致 Jurgen
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好...
我还有一个问题。 在 MSP430F2012中、我已对 I2C 从设备应用程序进行了编程。 I2C 总线上连接更多器件。 当主器件提示从器件进行数据传输时、在传输后、2012从器件始终处于 I2C 中断状态。 任何操作都无法停止此中断、程序处于无限循环中。 我可以做什么来停止无限循环。 我使用了 TI 的一个示例:msp430x20x3_USI_09.s43。
此致 Jurgen
您好、Gary、
非常感谢您的回答。
我已经稍微更改了代码、但我认为这不是导致此行为的原因。
我的更改、另一个从器件地址、而不是 LMP0模式。
一个奇怪的行为是我不能删除"USIIFG"位。 我在调试模式中清除该位、同时再次设置该位。
为什么可以在 C 中更好地进行调试?
编译器会像示例一样制作汇编器。
此致 Jurgen
CLR.b &DCOCTL ;选择最低 DCOx 和 MODx 设置
MOV.b &CALBC1_8MHZ,&BCSCTL1 ;将 DCO 设置为8MHz
MOV.b &CALDCO_8MHZ、DCOCTL
MOV.b #0xD4、&P1SEL ;P1.6 & P1.7 I2C、P1.4 SMCLK、P1.2 TACapture
MOV.b #0x3B、&P1DIR ;未使用的引脚输出方向
CLR.b &P1OUT ;P1 löschen
MOV.b #0xc0、&P2DIR ;P2输出
BIS.b #DIVS_3、&BCSCTL2 ;SMCLK/8
BIS.b #1、P1OUT ;P1.0 LED 输入
MOV #2、R10
调用 #delay
BIC.b #1、P1OUT ;P1.0 LED 状态
MOV #2、R10
调用 #delay
;SetupUSI
BIS.b #USISWRST、USICTL0
BIS.b #USIPE6+USIPE7、USICTL0 ;端口、I2C 从器件
; mov.b #USIIE+USII2C+USISTTIE,和 USICTL1;启用 I2C 模式
MOV.b #USII2C+USISTTIE,&USICTL1 ;启用 I2C 模式
MOV.b #USICKPL、和 USICKCTL ;设置时钟极性
BIS.b #USIIFGCC,和 USICNT ;禁用自动清除控制
BIC.b #USISWRST、USICTL0 ;启用 USI
BIC.b #USIIFG,&USICTL1 ;清除挂起标志
BIC.b #USIOE、USICTL0 ;SDA 输入
BIS.b #USISCLREL、USICNT ;SCL 被释放
;子例程 I2C、I2C 数据传输
USI_ISR
;------------------------------------------------------------------
// mov #WDTPW + WDTCNTCL + WDTIS0、&WDTCTL
bit.b #USISTTIFG、USICTL1 ;开始输入?
Jnc Check_State
MOV.w #2、I2CState ;第一个 I2C 状态、Rx 地址
CHECK_STATE
ADD.w I2CState、PC ;I2C State Machine
JMP STATE0 ;I2CState=0
JMP STATE2 ;I2CState=2
JMP State4 ;I2CState=4
JMP STATE6 ;I2CState=6
JMP STATE8 ;I2CState=8
JMP STATE10 ;I2CState=10
;------------------------------------------------------------
STATE0
NOP ;Idle、不应该在这里
BIC.b #USIIFG,&USICTL1 ;清除挂起标志
TI
;--------------------------------------------------------
STATE2 ;接收从机地址
MOV.b &USICNT、R8 ;位计数器= 8、Rx 地址
和.b #0xE0、R8
ADD.b #0x8、R8
MOV.b R8、USICNT
BIC.b #USISTTIFG,和 USICTL1;清除启动标志
MOV #4, I2CState ;转至下一状态,chk 地址
BIC.b #USIIFG、和 USICTL1
TI
;------------------------------------------------------------
State4 ;处理地址并发送(N)ack
MOV #TIME_DAT、R12 ;Buffer Zeit und 基准面
BIS.b #USIOE、USICTL0;SDA =输出
MOV.b &USISRL、R9
RRA.b R9.
CMP.b #Slave_ADR、R9 ;地址匹配?
Jnz ;Add_nack
CLR.b 和 USISRL ;发送 ACK
MOV。 6、I2CState ;转至下一状态:TX 数据
BIS.b #0x01、USICNT ;发送 Ack 位
BIC.b #USIIFG、和 USICTL1
TI
ADD_NACK
*
BIS.b #USIGE+~USIOE、&USICTL0;透明锁存被启用
BIC.b #USIGE,&USICTL0;透明锁存被禁用
CLR.w &I2CState ;重置状态机
BIC.b #USIIFG、和 USICTL1
TI
;----------------------------------------------------
STATE6 ;发送数据字节
BIS.b #USIOE、&USICTL0 ;SDA =输出
MOV.b #3,和 USISRL ;发送数据字节
; mov.b @R12+、USISRL ;发送数据字节
BIS.b #0x8、USICNT ;位计数器= 8
MOV。 #8, I2CState ;进入下一状态,生成 STOP
BIC.b #USIIFG、和 USICTL1
TI
;----------------------------------------------------
STATE8 ;接收数据(N)Ack
BIC.b #USIOE、USICTL0;SDA =输入
BIS.b #0x01、USICNT ;接收(N) ACK
MOV。 #10、I2CState ;转至下一状态:检查(N) ACK
BIC.b #USIIFG、和 USICTL1
TI
;----------------------------------------------------
STATE10.
BIC.b #USIOE、USICTL0;SDA =输入
bit.b #0x01、USISRL ;如果 NACK 被接收
JC 出口
BIC.b #USIIFG、和 USICTL1
TI
;------------------------------------------------------------
退出
CLR。 I2CState; Reset state machine
BIC.b #USIIFG、和 USICTL1
TI
结束
您好、格里、
感谢您的回答。
对于从器件、我已将时钟从8MHz 更改为1MHz。 我可以使用示波器捕获 SDA 和 SCL。
MOV.b &CALBC1_1MHZ,&BCSCTL1 ;将 DCO 设定为1MHZ
MOV.b &CALDCO_1MHz、&DCOCTL
I2C SCL 为20kHz。
我已连接了通过 I2C 传输的制造商。
有时、这是一个死锁。 我找不到这种行为。 SDA 很低、主设备无法进行某人转移。 如果我开始以下序列:
BIS.b #USIGE,&USICTL0;输出锁存器始终启用且透明
BIS.b #USIOE、USICTL0;输出被启用
BIS.b #USIOE,&USICTL0;输出被禁用
之后、SDA 变为高电平。 然后、传输再次正常、数据可以再次传输。
当之前有一个到另一个从器件的传输时、就会发生这种行为。
此致 Jurgen
您好、Gary、
非常感谢你的帮助。
我将向您发送我的程序。 该程序对 DCFF77信号进行解码。 我接收到的时间和日期可通过 I2C 总线进行传输。 从器件打开一个时间窗口。 在此窗口期间、主器件可以检索时间和日期。
该程序包含一个 C 语言程序和一个汇编程序。 在汇编器程序中、I2C 传输被实现。 C 程序处理时间和日期的准备。 日期和时间存储在结构变量中。 当主器件检索时间和日期时、应传输10个字节。
该程序不会使用中断进行 I2C 传输。
程序通过测试 USISTTIFG 标志来轮询主器件的请求。 在主器件请求数据后、会调用汇编器程序中的子例程、以通过 I2C 总线传输10个字节。
e2e.ti.com/.../DCF77_5F00_Stromz_5F00_F2012_5F00_ass5.rarBest此致 Jurgene2e.ti.com/.../1780.DCF77_5F00_Stromz_5F00_F2012.c