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:SPI读取保存数据

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

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/656289/ccs-tdc7200-spi-reading-an-save-data

部件号:TDC7200

工具/软件:Code Composer Studio

您好,

我的SPI函数有一些问题。

如果我检查了通信,则通信工作正常,所有字节数都在读取。

我的问题是保存此读取数据。

我尝试使用不同的函数读取和保存寄存器值,一个函数使用TDC7200的自动增量并将数据保存在数组(SPI_ReadAll_Reg())中,另一个函数只读一个寄存器,并进行位移操作(SPI_READ_longbyte())。

在这两个函数中,保存读数值似乎有相同的问题。

因为每次丢失最后一个值,RX缓冲区不会立即复制该值。 为什么RX缓冲器不立即复制值??? 我尝试了很多东西,如果 我用I<40编写for循环,我只能用SPI_ReadAll_Reg ()数据中的所有值[],但这会增加一个时钟周期。 (参见下图)

这种时钟周期(零读取值)使我的通信出现不必要的延迟,并且我的应用程序需要非常快速的通信

我的代码中出现了什么问题?? 它与TDC7200的SPI示例函数几乎相同!! 如何解决???? 请帮帮我。

#include <MSP4S.h>
#include <stdint.h>
#include
<stdlib.h>/**

* main.c
*/



void SPI_init(void);
void spi_write_config(uint8_t,uint8_t);

uint8_t spi_read_singlebyte(uint8_int_lut);uint_8_read_t_ut_lut)


UINT8_t数据[40];
UINT32_t wert;
int main (void)
{

uint8_t i;
WDTCTL = WDTPW | WDTHOLD; //停止监视计时器

SPI_init();
SPI_WRITE_CONFIG (0x40,0x03); //使用命令Meas Mode2/StartMeas Config1写入寄存器地址00h
SPI_write_config(0x41,0x40); //使用命令Single Stop/1 Measurement_cycle/ 10 Clock_周期Config1写入寄存器地址01h

wert = SPI_READ_longbyte(0x10); //只读一个具有位移的寄存器

SPI_ReadAll_Reg (0x90); // autocinc读取寄存器读取数组中的所有寄存器


(i = 0;i <= 39;I++)
{
printf("%x\n", data[i);}

printf ("%x\n",wert);

返回0;

}

void spI_write_config(uint8_t adress,uint8_t value)
{

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

while (!(UCB0IFG和UCTXIFG)); //等待TXBUF
UCB0TXBUF =地址; //发送地址以注册00h

while (!(UCB0IFG和UCTXIFG)); //等待TXBUF
UCB0TXBUF =值; //编写一个命令以注册00h

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

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


uint8_t spi_read_singlebyte(uint8_t adress)
{
uINT8_t rcv;

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

while (!(UCB0IFG和UCTXIFG)); //等待TXBUF
UCB0TXBUF =地址; //发送地址以注册02h

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

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

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

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

返回rcv;
}
*/

void SPI_ReadAll_Reg (uint8_t adress )
{

uint8_t I,a=0;


P2OUT &=(~BIT2); //

选择设备同时(!(UCB0IFG&UCTXIFG)); //等待TXBUF就绪
UCB0TXBUF =地址;

用于(i=0;i<39;i++) //如果I条件是ste到i<40,则我可以正确获取我的数据[]数组中的所有值,但还可以使用额外的时钟周期
{
同时(!(UCB0IFG&UCTXIFG)); //等待TXBUF就绪
UCB0TXBUF = 0; //虚拟写入,以便我们可以读取数据

while (!(UCB0IFG和UCRXIFG)); //等待RXBUF就绪
A = UCB0RXBUF;

数据[I]= A;
期间(UCB0STAT和UCBUSY); //等待RX完成

}

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

}

UINT32_t SPI_READ_longbyte(uint8_t地址){

uINT32_t y = 0,x = 0;

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

while (!(UCB0IFG和UCTXIFG)); //等待TXBUF
UCB0TXBUF =地址; //发送地址以注册02h

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;

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

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

printf("%x\n",x);

return x;

}

void spi_init(void){/*


UCSCTL3 |= SELREF_2; //设置DCO FLL参考= REFO
UCSCTL4 |=拉美经济体系2; //设置ACLK = REFO

__bis_sr_register (SCG0); //禁用FLL控制回路
UCSCTL0 = 0x0000; //设置尽可能低的DCOx,MODx
UCSCTL1 = DCORSEL_5; //选择DCO范围24MHz操作
UCSCTL2 = FLLD_1 + 374; //将DCO乘数设置为12MHz
//(N + 1)* FLLRef = Fdco
//(374 + 1)* 3.2768万 = 12MHz
//设置FLL Div = fDCOCLK/2
__BIC_SR_REGISTER (SCG0); //启用FLL控制回路

//当DCO范围位已存在时,DCO的最坏情况下稳定时间
//更改的是n x 32 x 32 x f_MCLK / f_FLL_reference。 请参阅5xx中的UCS章节
// UG进行优化。
// 32 x 32 x 12 MHz / 3.2768万 Hz = 37.5万 = MCLK周期,以便DCO稳定下来
__DELAY周期(37.5万);

//循环,直到XT1,XT2和DCO故障标志被清除
做
{
UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);
//清除XT2,XT1,DCO故障标志
SFRIFG1 &=~OFIFG; //清除故障标志
}同时(SFRIFG1&OFIFG); //测试振荡器故障标志
*////
启用PIN aktivieren für Register Zugriff//
P6OUT |=BIT5; //输出高使能引脚Aktiv
P6DIR |=BIT5; //用于TDC7200的输出启用引脚


// SPI引脚Auswählen //
P3SEL = BIT0 + BIT1 + BIT2;
P2OUT |= BIT2; // 2.2 设置芯片选择引脚高位
P2DIR || BIT2; // 2.2 Sippset as Chipselect


//配置为SPI-Register//
UCB0CTL1 |= UCSWRST; //启用statemachine
UCB0CTL1 |= UCSSEL_2;

UCB0CTL0 = UCMST+UCMSB+UCCKPH+UCSYNC;// SPI配置(MasterMode;SynchroneMode;Clock_Polarity;MSBfirstMode)

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


UCA0MCTL = 0; // No Modulation
UCB0CTL1 &=~UCSWRST; //禁用软件重置
//UCB0IE |= UCRXIE; //启用USI_B0 RX中断
}



问候Ben

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

    将来在论坛中选择要获得帮助的设备时,最好使用您询问的部分,而不是您要连接的部分。 换句话说,您在这里使用什么MSP430?

    我还在您的代码中看到,您有时与USCI B0和USCI A0不匹配。 这些是设备上不同的物理USCI,但具有相似的寄存器。

    另外,请参阅以下应用说明,了解一些与USCI SPI接口有关的非常常见的问题。 如果此应用说明不涵盖您的问题,请在此处再次发布 。http://www.ti.com/lit/slaa734
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Jace:

    很抱歉缺少信息。

    我使用MSP 43.0552万9 µC。

    您写的I不匹配USCI B0,但我只发现NO Modulation位不匹配。

    因为 在“知道”的库中只有定义的USCI A0,所以这对我的代码没有影响,但我读到过,这个调制位通常设置为零,我不再关心它。

    但我的问题仍然存在。

    我对SPI通信没有直接的问题。

    仅保存读取数据会出现问题,因为总是缺少每个SPI序列的最后一个值。  

    我不理解这个问题,因为我实现了几乎与TDC7200的示例代码相同的代码。

    有人能帮我解决这个丢失的字节吗???

    问候Ben

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

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经解决了我的问题。
    我必须在所有TX buf写入命令后读取RX BUF,以清除等待的RXbuffer值。

    我在这个问题上的困惑是,TDC7200的TI示例代码在每次传输TXBUFF后都不会读取此RXBUFF值。

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

    很高兴您能够解决您的问题,感谢您在此处跟进并发布相关信息!