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:(TI_TDC720x_SPILongReadReg) SPI 时钟保持低电平

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

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/654945/ccs-tdc7200-ti_tdc720x_spilongreadreg-spi-clock-stay-low

器件型号:TDC7200

工具/软件:Code Composer Studio

你(们)好。

首先是我的所有源代码:

#include 
#include 
#include 
/**
* main.c
*/


uint32_t time[5];
void spi_init (void);
int t、inter_stat;
void spi_write_config1 (uint8_t、uint8_t);
void spi_write_config2 (uint8_t、uint8_t);
void SPI_WRITE_INTERRUPT_MASK (uint8_t、uint8_t);
uint8_t SPI_READ_INTERRUPT_STATUS (uint8_t); // ist unnötig kann auch im singlebyte gelesen werden und in der main so konfiguriert
uint8_t spi_read_singlebyte (uint8_t);
uint32_t spi_read_longbyte (uint8_t);

int main (void)

{
uint32_t Time1_6;
uint8_t i;

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

spi_init();
SPI_WRITE_CONFIG1 (0x40、0x03); //使用命令写入寄存器地址00h
SPI_WRITE_CONFIG2 (0x41、0x40);
//inter_stat = SPI_READ_INTERRUPT_STATUS (0x02);
//SPI_WRITE_INTERRUPT_MASK (0x43、0x00);
Time1_6 = SPI_READ_longbyte (0x90);// lesen der time 1_6寄存器发送自动包含



返回0;

}

uint32_t spi_read_longbyte (uint8_t 地址)
{
uint32_t y = 0;
uint32_t x = 0;

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

while (!(UCB0IFG & UCTXIFG)); //等待 TXBUF
UCB0TXBUF =地址; //发送地址 für ...

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

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

x |=(y << 16);

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

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

x |=(y << 8);

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

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

x |= y;

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

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

返回 x;
}



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); //取消选择器件
}

uint8_t spi_read_interrupt_status (uint8_t 地址)
{
uint8_t rcv;
//uint8_t clear = 0x1F; //清除中断标志??
P2OUT &=(~BIT2); //选择设备

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

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

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

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

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

返回 rcv;
}

void spi_write_interrupt_mask (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)
{

//启用 PIN aktivieren für 寄存器 Zugriff//
P6DIR |=BIT5; // TDC7200
P6OUT 的输出使能引脚|=BIT5; //输出高电平使能引脚 Aktiv

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

// Konfigdes SPI-Registers//
UCB0CTL1 |= UCSWRST;
UCB0CTL1 |= UCSSEL_2;

UCB0CTL0 = UCMST+UCMSB+UCCKPH+UCSYNC;// SPI 配置(MasterMode;UCB0CTL0

= UCB0BR0;UCB0BR0;UCTL0 = UCCKPHY0;UCCKTH+UCB0BR0;UCB0BR0 = UCTL //预分频
器 UCB0BR1 = 0;


UCA0MCTL = 0; //无调制
UCB0CTL1 &=~UCSWRST; //禁用软件复位
// UCB0IE |= UCRXIE; //启用 USCI_B0 RX 中断
}

我尝试使用 TDC7200_basic_spi_rw 中修改的示例函 数读取时间1寄存器:uint32_t TI_TDC720x_SPILongReadReg (uint8_t addr)。

其结果是、在执行每个位移位命令后、时钟保持低电平:

之后、我尝试 在每个 y 缓冲区接收到并且全部 while (!(UCB0IFG & UCTXIFG));循环后注释掉位移位运算。 现在、我得到了一个我想要的32 clk 周期、在这里有任何中断:

我的问题是:是否可以使用此函数读取我的时间寄存器和其他只读取寄存器、如果可能、我如何解决?

如何将此函数与自动递增位一起使用?

提前感谢  

问候 Ben

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

    您好 Ben、

    您的代码与 TDC1000-TDC7200EVM 固件源代码中的 TI_TDC7200_SPILongReadReg ()功能基本相同。 您正在读取的数据是否正确、唯一的问题是移位时 SPI 时钟的关闭时间? 在这种情况下、我建议继续使用此代码、除非交易时间是一个问题。

    实际的 EVM 固件还包括一个实现自动递增的函数、称为 TI_TDC7200_SPIALReadReg ()、复制于此处以供参考:

    ///----------------------------------
    // void TI_TDC7200_SPIallReadReg (uint8_t *缓冲区)
    //
    说明:
    //用于读取所有测量结果寄存器的特殊读取函数。
    //数据读取从地址“缓冲区”开始按顺序存放
    ,从地址“缓冲区”开始。
    void TI_TDC7200_SPIALReadReg (uint8_t *缓冲区)
    {
    
    uint8_t i、inst;
    
    TI_TDC7200_CSn_PxOUT &=~TI_TDC7200_CSn_PIN; ///CS enable
    
    //读取模式和 auto_inc on
    inst=0x90;
    
    while (!(UCB0IFG&UCTXIFG)); //等待 TXBUF 就绪
    UCB0TXBUF = inst; //发送寄存器地址
    
    
    对于(i=0;i 
    

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

    您好、Scott、

    感谢您的回复我尝试使用此示例函数、但我在读取中不使用指针*缓冲区。 但是这个实验并不是很成功。

    因为我直接在数组中读取 RXBUF、所以我总是丢失校准2寄存器中的最后一个字节。 在下一个 SPI 读取序列之后、阵列每次都会获取这些值。

    我的第一个问题是为什么他们不立即在我的数组中读取 RXBUF?  

    第二个问题是:如果我不像您一样使用指针、我的函数 SPI_READ_ALL 中是否会出现延迟。 因为我的应用程序必须以最快的速度运行。   

    void SPI_init (void);
    void SPI_WRITE_CONFIG1 (uint8_t、uint8_t);
    void SPI_WRITE_CONFIG2 (uint8_t、uint8_t);
    uint8_t SPI_READ_singlebyte (uint8_t);
    void SPI_ReadAll_Reg (uint8_t);
    
    uint8_t data[40];
    
    int main (void)
    {
    
    uint8_t i;
    
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    
    spi_init();
    SPI_WRITE_CONFIG1 (0x40、0x03); //使用命令写入寄存器地址00h
    SPI_WRITE_CONFIG2 (0x41、0x40);
    SPI_ReadAll_Reg (0x90);
    
    对于(I = 0;I <= 40;I++)
    {
    printf ("%x\n"、data[i]);
    }
    printf ("%x\n"、data[39]);
    返回0;
    
    }
    
    void SPI_ReadAll_Reg (uint8_t adress)
    {
    
    uint8_t I、a;
    
    
    P2OUT &=(~BIT2); //选择 Device
    
    while (!(UCB0IFG&UCTXIFG)); //等待 TXBUF 就绪
    UCB0TXBUF =地址;
    
    
    对于(i=0;i<39;i++)
    {
    while (!(UCB0IFG&UCTXIFG)); //等待 TXBUF 准备就绪
    UCB0TXBUF = 0; //虚拟写入,以便我们可以读取数据
    
    while (!(UCB0IFG&UCRXIFG)); //等待 RXBUF 准备就绪
    A = UCB0RXBUF;
    
    DATA[i]= A;
    
    }
    
    
    
    P2OUT |=(BIT2); //取消选择设备
    
    } 

    谢谢 Ben

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

    器件型号:TDC7200

    工具/软件:Code Composer Studio

    你(们)好。

    我尝试使用此示例函数、但在读取中不使用指针*缓冲区。 但是这个实验并不是很成功。

    因为我直接在数组中读取 RXBUF、所以我总是丢失校准2寄存器中的最后一个字节。 在下一个 SPI 读取序列之后、阵列每次都会获取这些值。

    我的第一个问题是为什么他们不立即在我的数组中读取 RXBUF?

    第二个问题是:如果我不像您一样使用指针、我的函数 SPI_READ_ALL 中是否会出现延迟? 因为我的应用程序必须以最快的速度运行。   


    void SPI_init (void);
    
    void SPI_WRITE_CONFIG1 (uint8_t、uint8_t);
    
    void SPI_WRITE_CONFIG2 (uint8_t、uint8_t);
    
    uint8_t SPI_READ_singlebyte (uint8_t);
    
    void SPI_ReadAll_Reg (uint8_t);
    
    
    uint8_t data[40];
    
    
    int main (void)
    
    {
    
    
    uint8_t i;
    
    
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    
    
    spi_init();
    
    SPI_WRITE_CONFIG1 (0x40、0x03); //使用命令写入寄存器地址00h
    
    SPI_WRITE_CONFIG2 (0x41、0x40);
    
    SPI_ReadAll_Reg (0x90);
    
    
    对于(I = 0;I <= 40;I++)
    
    {
    
    printf ("%x\n"、data[i]);
    
    }
    
    printf ("%x\n"、data[39]);
    
    返回0;
    
    
    }
    
    
    void SPI_ReadAll_Reg (uint8_t adress)
    
    {
    
    
    uint8_t I、a;
    
    
    
    P2OUT &=(~BIT2); //选择 Device
    
    
    while (!(UCB0IFG&UCTXIFG)); //等待 TXBUF 就绪
    
    UCB0TXBUF =地址;
    
    
    
    
    
    对于(i=0;i<39;i++)
    
    {
    
    while (!(UCB0IFG&UCTXIFG)); //等待 TXBUF 准备就绪
    
    UCB0TXBUF = 0; //虚拟写入,以便我们可以读取数据
    
    
    while (!(UCB0IFG&UCRXIFG)); //等待 RXBUF 准备就绪
    
    A = UCB0RXBUF;
    
    
    DATA[i]= A;
    
    
    }
    
    
    
    
    P2OUT |=(BIT2); //取消选择设备
    
    
    } 

    问候 Ben

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    void SPI_init (void);
    
    void SPI_WRITE_CONFIG1 (uint8_t、uint8_t);
    
    void SPI_WRITE_CONFIG2 (uint8_t、uint8_t);
    
    uint8_t SPI_READ_singlebyte (uint8_t);
    
    void SPI_ReadAll_Reg (uint8_t);
    
    
    uint8_t data[40];
    
    
    int main (void)
    
    {
    
    
    uint8_t i;
    
    
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    
    
    spi_init();
    
    SPI_WRITE_CONFIG1 (0x40、0x03); //使用命令写入寄存器地址00h
    
    SPI_WRITE_CONFIG2 (0x41、0x40);
    
    SPI_ReadAll_Reg (0x90);
    
    
    对于(I = 0;I <= 40;I++)
    
    {
    
    printf ("%x\n"、data[i]);
    
    }
    
    printf ("%x\n"、data[39]);
    
    返回0;
    
    
    }
    
    
    void SPI_ReadAll_Reg (uint8_t adress)
    
    {
    
    
    uint8_t I、a;
    
    
    
    P2OUT &=(~BIT2); //选择 Device
    
    
    while (!(UCB0IFG&UCTXIFG)); //等待 TXBUF 就绪
    
    UCB0TXBUF =地址;
    
    
    
    
    
    对于(i=0;i<39;i++)
    
    {
    
    while (!(UCB0IFG&UCTXIFG)); //等待 TXBUF 准备就绪
    
    UCB0TXBUF = 0; //虚拟写入,以便我们可以读取数据
    
    
    while (!(UCB0IFG&UCRXIFG)); //等待 RXBUF 准备就绪
    
    A = UCB0RXBUF;
    
    
    DATA[i]= A;
    
    
    }
    
    
    
    
    P2OUT |=(BIT2); //取消选择设备
    
    
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    现在、我测试一个读取一个寄存器32位的函数(请参阅下面的代码)。
    在 uint32_t SPI_READ_longbyte 中、我遇到的问题与函数 SPI_ReadAll_Reg.
    来自寄存器的最后一个字节在变量 y 中丢失、但在示波器上、我看到最后接收到的字节。
    为什么最后一个字节在我的函数中丢失?这是计时问题??
    感谢您的回复。


    uint32_t spi_read_longbyte (uint8_t 地址)

    uint64_t y= 0;

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

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

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

    while (!(UCB0IFG&UCRXIFG)); //等待 RXBUF 准备就绪
    Y = UCB0RXBUF;
    y |=(y << 16);

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

    while (!(UCB0IFG&UCRXIFG)); //等待 RXBUF 准备就绪
    Y = UCB0RXBUF;
    y |=(y << 8);

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

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

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

    P2OUT |=(BIT2); //取消选择设备
    printf ("%x\n",y);
    返回 y;



    对 Ben L.