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.
我想使用 i2c 通信从 tmp007获取温度、您能用 c 语言的 CCS 编码指导我完成这一过程吗? 我使用的是一个 tmp007温度传感器、其 i2c 从器件地址为0x40。 您是否会向我提供如何继续此过程。
您好!
这里有一些 I2C 代码示例。 它应该会有所帮助。
https://www.ti.com/lit/zip/slac300
此致、
现金 Hao
#include
字符 Data_in;
/**
* main.c
*
void main (void)
{volatile int i;
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
UCB0CTL1 |= UCSWRST;
UCB0CTL1 |= UCSSEL_3;
UCB0BRW=10;
UCB0CTLW0 |=UCMODE_3+UCSYNC;
UCB0CTL0 |= UCMST;
UCB0I2CSA = 0x40;
UCB0TBCNT = 1;
UCB0CTLW1 |=UCASTP_2;
P3SEL |= 0x03;
UCB0CTL1 &=~UCSWRST;
UCB0IE |= UCTXIE;
UCB0IE |= UCRXIE;
_enable_interrupt ();
while (1)
{
UCB0CTLW0 |=UCTR;
UCB0CTLW0 |=UCTXSTT;
while (((UCB0IFG & UCSTPIFG)=0){}
UCB0IFG &=~UCSTPIFG;
UCB0CTLW0 &=~UCTR;
UCB0CTLW0 |=UCTXSTT;
while (((UCB0IFG & UCSTPIFG)=0){}
UCB0IFG &=~UCSTPIFG;
}
}
#pragma vector = USCI_B0_vector
_interrupt void USCI_B0_ISR (void)
{
switch (UCB0IV){
情况0x16:
DATA_IN=UCB0RXBUF;
中断;
情况0x18:
UCB0TXBUF = 0x01;
中断;
默认值:
中断;
}
}
我生成了这样的代码、它显示 UCB0TBCNT 未定义
F5529具有 USCI、而不是 eUSCI。 USCI 没有自动停止功能(UCASTTP 和 TBCNT)。 请确保阅读的是用户指南(SLAU208Q)第38章、而不是第41章。
如果更方便、示例也位于 Resource Explorer 中、位于此处:
https://dev.ti.com/tirex/explore/node?node=ACt.3NsUP.t3V3gtuC8DhQ__IOGqZri__LATEST
大家好、我已经在第38章中探讨了寄存器 、我喜欢这样做
#include
字符 Data_in;
/**
* main.c
*
void main (void)
{volatile int i;
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
UCB0CTL1 |= UCSWRST;
UCB0CTL1 |= UCSSEL_3;
UCB0BRW=10;
UCB0CTLW0 |=UCMODE_3;
UCB0CTL0 |= UCMST;
UCB0I2CSA = 0x40;
P3SEL |= 0x03;
UCB0CTL1 &=~UCSWRST;
UCB0IE |= UCTXIE;
UCB0IE |= UCRXIE;
_enable_interrupt ();
while (1)
{
UCB0CTLW0 |=UCTR;
UCB0CTLW0 |=UCTXSTT;
while (((UCB0IFG & UCSTPIFG)=0){}
UCB0IFG &=~UCSTPIFG;
UCB0CTLW0 &=~UCTR;
UCB0CTLW0 |=UCTXSTT;
while (((UCB0IFG & UCSTPIFG)=0){}
UCB0IFG &=~UCSTPIFG;
}
}
#pragma vector = USCI_B0_vector
_interrupt void USCI_B0_ISR (void)
{
switch (UCB0IV){
情况0x16:
DATA_IN=UCB0RXBUF;
中断;
情况0x18:
UCB0TXBUF = 0x01;
中断;
默认值:
中断;
}
}
但我仍然无法在示波器中查看输出
我想从从从地址40和寄存器地址0x1h 读取数据
尽管我在示波器中没有得到任何 o/p,但有任何特定的寄存器可直接查看数据。
#include
字符 Data_in;
/**
* main.c
*
void main (void)
{volatile int i;
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
UCB0CTL1 |= UCSWRST;
UCB0CTL1 |= UCSSEL_2;
UCB0BR0 = 12;// fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
UCB0CTLW0 |=UCMODE_3+ UCSYNC;
UCB0CTL0 |= UCMST;
UCB0I2CSA = 0x40;
P3SEL |= 0x03;
UCB0CTL1 &=~UCSWRST;
UCB0IE |= UCTXIE;
UCB0IE |= UCRXIE;
_enable_interrupt ();
while (1)
{
UCB0CTLW0 |=UCTR;
UCB0CTLW0 |=UCTXSTT;
while (((UCB0IFG & UCSTPIFG)=0){}
UCB0IFG &=~UCSTPIFG;
UCB0CTLW0 &=~UCTR;
UCB0CTLW0 |=UCTXSTT;
while (((UCB0IFG & UCSTPIFG)=0){}
UCB0IFG &=~UCSTPIFG;
}
}
#pragma vector = USCI_B0_vector
_interrupt void USCI_B0_ISR (void)
{
switch (UCB0IV){
情况0x02:
DATA_IN=UCB0RXBUF;
中断;
情况0x04:
UCB0TXBUF = 0x01;
中断;
默认值:
中断;
}
}
O/p 正像这个时钟那样正常
1) 1) RXIFG/TXIFG 的 UCB0IV 值为0x0A/0x0C [参考用户指南(SLAU208Q)表38-14]。
2) 2)我不确定示波器迹线显示的内容。 如果您没有时钟、请检查您的上拉电阻器。
3) 3) TI 发布了 USCI 故障排除指南(SLAA734A)、可能值得一看:
https://www.ti.com/lit/an/slaa734a/slaa734a.pdf
4) 4)我建议您至少阅读上述 I2C 示例。 您选择的序列可能起作用、但我尚未尝试。
#include
字符 Data_in=0;
void main (void)
{volatile int i;
WDTCTL = WDTPW + WDTHOLD;//停止 WDT // P1.0输出
P3SEL |= 0x03;//将 I2C 引脚分配给 USCI_B0
UCB0CTL1 |= UCSWRST;//启用 SW 复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、同步模式
UCB0CTL1 |= UCSSEL_2;//使用 SMCLK
UCB0BR0 = 12;// fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
UCB0I2CSA = 0x40;//从地址为048h
UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
UCB0IE |= UCRXIE;
UCB0IE |= UCTXIE;
_enable_interrupt ();
while (1)
{
UCB0CTL1 |=UCTR;
UCB0CTL1 |=UCTXSTT;
while (((UCB0IFG & UCSTPIFG)=0){}
UCB0IFG &=~UCSTPIFG;
UCB0CTL1 &=~UCTR;
UCB0CTL1 |=UCTXSTT;
while (((UCB0IFG & UCSTPIFG)=0){}
UCB0IFG &=~UCSTPIFG;
}
}
#pragma vector = USCI_B0_vector
_interrupt void USCI_B0_ISR (void)
{
switch (UCB0IV){
情况0x0A:
DATA_IN=UCB0RXBUF;
中断;
情况0x0C:
UCB0TXBUF = 0x03;
中断;
默认值:
中断;
}
}
这是我同时使用的代码、我更改了相同的代码、但 没有得到真正的所需代码。
您好!
图中的 D0、D1和总线1是什么? 您是否在测试代码时连接到 I2C 从设备?
此致、
现金 Hao
是的、我已经分享了另一个论坛现金、这是我的当前状态、您可以查看它