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.

[参考译文] CCS/TDC7200:在发生中断时从 TDC7200读取寄存器

Guru**** 2589245 points
Other Parts Discussed in Thread: TDC7200

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/654110/ccs-tdc7200-reading-a-register-from-tdc7200-whithout-interrupts

器件型号:TDC7200

工具/软件:Code Composer Studio

您好!

我尝试 通过 SPI 与 TDC7200和 MSP430 5529lp 通信。

写入操作成功、但当我想读取我在发出任何中断之前写入的同一寄存器时。  

我在示波器上只看到读取地址+命令。

现在、我的问题是、可以不中断地读取数据吗? 我的错在哪里?

我是一个新手^^希望大家能帮助我解决这个问题

代码:

#include 
#include 

/**
* main.c
*/
uint8_t read_val;
unsigned long rcv;
unsigned char 数据;
void SPI_init (void);

void SPI_write_config1 (uint8_t、uint8_t);
void SPI_WRITE_CONFIG2 (uint8_t、uint8_t);
void SPI_WRITE_CONFIG3 (uint8_t、uint8_t);
uint8_t SPI_WRITE_READ_TIME (uint8_t);
int main (void)
{

WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器

spi_init();
SPI_WRITE_CONFIG1 (0x40、0x02); //使用命令写入寄存器地址00h
SPI_WRITE_CONFIG2 (0x41、0x40);
SPI_WRITE_CONFIG3 (0x42、0x00);
Read_val = SPI_WRITE_READ_TIME (0x00);//示例:读取寄存器地址00h


}


void SPI_WRITE_CONFIG1 (uint8_t 地址、uint8_t 值)
{

P2OUT &=(~BIT2); //选择设备

while (!(UCB0IFG & UCTXIFG)); //等待 TXBUF
UCB0TXBUF =地址; //将地址发送到寄存器00h

while (!(UCB0IFG & UCTXIFG)); //等待 TXBUF
UCB0TXBUF =值; //向寄存器00h 写入命令

while (UCB0STAT 和 UCBUSY); //等待 TX 完成


P2OUT |=(BIT2); //取消选择设备
}

void spi_write_config2 (uint8_t 地址、uint8_t 值)
{

P2OUT &=(~BIT2); //选择设备

while (!(UCB0IFG & UCTXIFG)); //等待 TXBUF
UCB0TXBUF =地址; //将地址发送到寄存器01h

while (!(UCB0IFG & UCTXIFG)); //等待 TXBUF
UCB0TXBUF =值; //向寄存器01h 写入命令

while (UCB0STAT 和 UCBUSY); //等待 TX 完成


P2OUT |=(BIT2); //取消选择设备
}

void spi_write_config3 (uint8_t 地址、uint8_t 值)
{

P2OUT &=(~BIT2); //选择设备

while (!(UCB0IFG & UCTXIFG)); //等待 TXBUF
UCB0TXBUF =地址; //将地址发送到寄存器01h

while (!(UCB0IFG & UCTXIFG)); //等待 TXBUF
UCB0TXBUF =值; //向寄存器01h 写入命令

while (UCB0STAT 和 UCBUSY); //等待 TX 完成


P2OUT |=(BIT2); //取消选择器件
}

void SPI_init (void)
{

// SPI 引脚 Auswählen //
P3SEL = BIT0 + BIT1 + BIT2;
P2DIR |= BIT2; // PIN2.2设置为 Chipselect
P2OUT |= BIT2; // PIN2.2将芯片选择引脚设置为高电平

//配置为 SPI 寄存器//
UCB0CTL1 |= UCSWRST;
UCB0CTL1 |= UCSSEL_2;

UCB0CTL0 = UCMST+UCMSB+UCCKPL+UCSYNC;// SPI 配置(主模式;同步模式;时钟极性;MSBfirstMode)

UCB0BR0 = 0x02; //预分频
器 UCB0BR1 = 0;


UCA0MCTL = 0; //无调制
UCB0CTL1 &=~UCSWRST; //禁用软件复位

}


uint8_t spi_write_read_time (uint8_t 地址)
{

P2OUT &=(~BIT2); //选择设备

while (!(UCB0IFG & UCTXIFG)); //等待 TXBUF 准备就绪
UCB0TXBUF =地址; //向寄存器发送 adresse + read 命令

while (!(UCB0IFG&UCTXIFG)); //等待 TXBUF 准备就绪
UCB0TXBUF = 0; //虚拟写入以读取数据



while (!(UCB0IFG&UCRXIFG)); //等待 RXBUF 准备就绪
RCV = UCB0RXBUF;

P2OUT |=(BIT2); //取消选择设备
return (rcv);
}



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Benjamin、

    虽然 SPI 设置可能存在问题、但这看起来不错。 在第94行、您设置了 UCCKPL、而在我们的示例中、我们有 UCCKPH。 请参阅以下内容:

    void TI_TDC1000_SPISetup (void)
    {
    TI_TDC1000_CSn_PxOUT |= TI_TDC1000_CSn_PIN;
    TI_TDC1000_CSn_PxDIR |= TI_TDC1000_CSn_PIN; ///CS 禁用
    
    UCB0CTL1 |= UCSWRST; //**禁用 USCI 状态机**
    UCB0CTL0 |= UCMST+UCMSB+UCCKPH+UCSYNC; // 3引脚、8位 SPI 主
    器件 UCB0CTL1 |= UCSSEL_SMCLK; //选择 SMCLK
    
    UCB0BR0 = 0x02; // UCLK/2 (对于24MHz SMCLK 应为12MHz)
    UCB0BR1 = 0;
    TI_TDC1000_SPI_USCIB0_PxSEL1 |= TI_TDC1000_SPI_USCIB0_SIMO
    | TI_TDC1000_SPI_USCIB0_SOMI;
    TI_TDC1000_SPI_USCIB0_PxSEL2 |= TI_TDC1000_SPI_USCIB0_UCLK;
    // SPI 选项选择
    TI_TDC1000_SPI_USCIB0_PxDIR1 |= TI_TDC1000_SPI_USCIB0_SIMO;
    TI_TDC1000_SPI_USCIB0_PxDIR2 |= TI_TDC1000_SPI_USCIB0_UCLK;
    // SPI TXD 输出方向
    
    UCB0CTL1 &=~UCSWRST; //**初始化 USCI 状态机**
    } 

    这来自 TDC1000-TDC7200EVM GUI 下载中包含的 SPI 读/写示例固件。 我建议在此处下载 GUI:  

    固件和示例代码将包含在 GUI 的安装目录中。

    话虽如此、您发布的写入和读取函数应该起作用、因此我认为问题可能出在 SPI 初始化中。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复