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.

[参考译文] MSP430FR5969:将数据从 MSP430FR5969发送到串行监视器

Guru**** 2581345 points
Other Parts Discussed in Thread: MSP430FR5969, TDC7200, MSP-EXP430FR5969, MSP-FET

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/702878/msp430fr5969-send-data-from-msp430fr5969-to-serial-monitor

器件型号:MSP430FR5969
主题中讨论的其他器件: TDC7200MSP-EXP430FR5969MSP-FETMSP430WARE

您好!

我使用 TDC 来测量激光雷达应用中的 ToF。 我为配置 TDC 和接收数据实施的代码如下所示。

我有两个问题:

1 -我想通过 SPI 读取24位寄存器(函数 SPI_Receive ())。 MSP430一次只接收1个字节(因此、为每个接收到的字节发送1个虚拟字节)吗?

2-我想通过 USB 将 ToF 结果发送到计算机,以便在串行监视器/MATLAB 中查看结果。 要发送数据的点标记为红色。 是否有人可以为我提供代码以执行此操作、或者告诉我如何设置此操作?

提前感谢、

Joaquim

#include
#include
#define nop __asm____volatile__("nop\n\t");              
float TOF_buffer;
void setup_TDC ();
void spi_send (uint8_t、int、int);
void SPI_Receive (uint8_t、uint8_t、int);
void TOF_read();
void setup(){           //设置系统
 WDTCTL = WDTPW | WDTHOLD;                      
 PM5CTL0 &=~LOCKLPM5;                        
 P2DIR &=~0x10;                           //将 P2.4设置为输入(TDC_INT)
 P2REN |= 0x10;                           //配置为上拉
 P2IES |= 0x10;                           //在 P2.4中的高电平到低电平转换时激活的中断(只要2个 TDC 中的任何一个触发中断)
 P2IFG &=~0x10;                           //清除中断标志
 P2IE |= 0x10;                            //启用中断
 // P3.4 (专用引脚)中的输出 SMCLK、频率与 F_CPU=16MHz (TDC 的最大值)相同- TDC_CLK                                   
 P3DIR |= 0x10;                           //将 P3.4设置为输出  
 P3SEL1 |= 0x10;                           //选择 SMCLK 功能(MSP430FR5969数据表中的表6-57)
 Setup_TDC ();                            //通过写入配置寄存器来设置 TDC
 延迟(2);                              // TDC 需要时间启动和稳定。 数据表 TDC7200 8.4.7 -建议在稳定时间(~2ms)之前不要开始时间测量
void loop(){                              
 NOP;                                 
#pragma vector=port2_vector
_interrupt void port2_ISR_Hook (void){                 
 P1OUT ^= 0x01;                            
 delayMicroseconds (3);                        
 TOF_READ();                             
 P2IFG &=~0x10;                           
 P2IE |= 0x10;                                                      
}                                   
void spi_send (uint8_t *数据、int len){                   
 while (len -= 2){                                 
  P3OUT &=~0x01;     
  while (!(UCB0IFG & UCTXIFG));                           
  UCB0TXBUF =*(DATA++);                              
  while (!(UCB0IFG & UCTXIFG));                   
  UCB0TXBUF =*(DATA++);   
  while (UCB0STAT 和 UCBUSY);                            
  P3OUT |= 0x01;          
 }
void setup_TDC (){                           
 // SPI 配置(USCIB0)
 P3DIR |= 0x01;                           TDC1 P3.0 (TDC_TX_CS)中的// CS 输出(低电平有效)
 P3OUT |= 0x01;
 UCB0CTLW0 = UCSWRST | UCSSEL_2;                   
 UCB0CTLW0 |= UCCKPH | UCMSB | UCSYNC | UCMST;            
 UCB0CTLW0 &=~UCCKPL;                        
 P1DIR &=~0b10000000;                        
 P1DIR |= 0b01000000;                         
 P1SEL1 |= 0b11000000;                        //这次,MISO 被激活                       
 P1SEL0 &=~0b11000000;
 P2DIR |= 0b00000100;                         
 P2SEL1 |= 0b0000100;                         
 P2SEL0 &=~0b00000100;
 UCB0BR0 = 2;                            //将 SPI_CLK 速度设置为8MHz
 UCB0BR1 = 0;  
 UCB0CTLW0 &=~UCSWRST;     
  
 uint8_t stream_tTDC[]={0b01000000、0b10011011、           
             0b01000001、0b01000000、          
             0b01000011、0b00000101、           
             0b01000110、0b00000000、           
             0b01000111、0b00110000};           
  
 SPI_SEND (STRE_TDC、sizeof (STREE_TDC)/sizeof (STREE_TDC[0]));               
void TOF_read (){                           //每当在 P2.4中检测到中断时从 TDC 读取数据
 uint8_t buffer_1[15]、buffer_2[15]、addr [5]={0x10、0x12、0x11、 0x1b、0x1C}; //存储 SPI 数据的数组(12个元素、因为只接收到24*5位= 15字节);带有寄存器地址的数组(BIT6=0 =>读取)
  
 SPI_Receive (buffer_1、addr、sizeof (addr)/sizeof (addr[0]));
  
 //模式2.
 TOF_buffer =(1/16)/(((buffer_2[14]+buffer_2[13]<8+buffer_2[12]<16)-(buffer_2[11]+buffer_2[10]<8+buffer_2[9]<16)/(10-1]+buffer2[8_2]+8_2[1]+buffer[1]+8_2[8_2]+buffer[1]+2]+[8_2]+[buffer[1]+[8_2]+buffer[1]+[2]+[8_2]+缓冲 器2]+[8_2]+缓冲 器  
      -(1/16)/((((buffer_1[14]+buffer_1[13]<<8+buffer_1[12]<16)-(buffer_1[11]+buffer_1[10]<<8+buffer_1][9]<16)/(10-1]+8_1[buffer[1]+1[8_1]+16]+1[buffer[1]<1]+1[8_1]<16]+1[buffer[1]<16]+1]+1[buffer[1]<16]+1]+1[buffer[1]+1]+1]+1[buffer[1]<16]<16]+1]+1[8_1]<16]<buffer[1]<buffer[1
  
 范围= TOF_BUFFER*0.3;                     //确定以米为单位的范围(d[m]=0.3*TOF[ns]),并增加数组中的位置
  
 //此处,通过 USB 将 ToF 和范围发送到 PC
 //重新开始测量
 uint8_t restart [2]={0b01000000、0b10000011};
 spi_send (restart、sizeof (restart)/sizeof (restart[0]));  
void spi_receive (uint8_t *缓冲区、uint8_t *地址、int len、int sel){     
 int k=0;                                  
 for (int j=0;<len;j++){                          
  (SEL=1? P3OUT &=~0x01:P1OUT &=~0x10);               
  while (!(UCB0IFG & UCTXIFG));                      
  UCB0TXBUF =*(addr++);                         
  for (int w=0;w<3;w++){                          
   while (!(UCB0IFG & UCTXIFG));                     
   UCB0TXBUF = 0;                            
   while (UCB0STAT 和 UCBUSY);                       
   Buffer[k++]=UCB0RXBUF;                         
  }
  while (UCB0STAT 和 UCBUSY);                                    
  (SEL=1? P3OUT |= 0x01:P1OUT |= 0x10);                
 }      
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、我想知道如何向 PC 发送浮点值
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joaquim、您好!

    [引用 USER="Joaquim Santos ]1 -我想通过 SPI (函数 SPI_Receive ())读取24位寄存器。 MSP430一次只接收1个字节(因此、为每个接收到的字节发送1个虚拟字节)吗?[/引用]

    正确。  MSP430一次接收一个字节、因此为了时钟输出一个24位值、您将在每次传输后发送3个虚拟字节并读取接收寄存器以获得碎片化结果。  然后、您可以将3个字节组合成一个32位变量、或者保留为8位字节格式、因为您计划无论如何通过串行接口流化它们。

    [引用 user="Joaquim Santos ">2-我想通过 USB 将 ToF 结果发送到计算机,以便在串行监视器/MATLAB 中查看结果。 要发送数据的点标记为红色。 是否有人可以为我提供这样做的代码、或者告诉我如何设置?

    如果您在 LaunchPad (即 MSP-EXP430FR5969)上或与 MSP-FET 调试探针一起使用 MSP430FR5969、则可以为此目的使用这些仿真器上的反向通道 UART 串行端口。  I MATLAB 您将连接到名为 MSP Application UART 1 (COMx)的 COM 端口。  从 MSP430FR5969的角度来看、您需要配置正确的 eUSCI_A UART 接口进行传输。  需要注意的一点是、我不建议在调试时使用此串行接口时使用9600波特以上的波特率、在不调试代码时不建议使用115200波特率以上的波特率、以确保不会丢弃任何字节。  如果您下载 MSP430Ware 软件包、我们将提供相关示例。

    [引用 user="Joaquim Santos "]此外,我想知道如何向 PC 发送浮点值[/quot]

    这有点棘手。  我建议将未格式化的数据直接从 MSP430流式化到 MATLAB、然后在 Matlab 中将24位数据修改为浮点。  这对我来说似乎是最简单的途径。  否则、您需要在没有浮点单元的 MSP430上执行浮点转换、除非绝对需要、否则我不建议这样做。  您还需要检查 MSP430上的浮点格式是否与您在 MATLAB 中期望的浮点格式相匹配、或者将其作为带有小数点的 ASCII 字符串流式在串行端口上(由于附加字符加上处理时间、传输效率低下)。  同样、我认为您的最佳路径是将3个字节的数据直接从 SPI 流式传输到 UART 中、然后从 MATLAB 中的虚拟 COM 端口获取这些数据并在那里进行转换。

    此致、
    Walter