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/ADS1298:使用 SPI 通信通过 MSP430f6736控制器读取 ADS1298放大器的器件 ID

Guru**** 2562120 points
Other Parts Discussed in Thread: MSP430F6736, ADS1298, MSP-FET

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/601174/ccs-ads1298-read-the-device-id-of-ads1298-amplifier-via-the-msp430f6736-controller-using-spi-communication

器件型号:ADS1298
主题中讨论的其他器件:MSP430F6736MSP-FET

工具/软件:Code Composer Studio

您好!

我一直在从事一个从 ADS1298放大器采集数据的项目。 我将 MSP430f6736微控制器与 ADS1298放大器搭配使用。 我编写了以下代码来捕获器件 ID。 它在编译时没有任何错误、但无法正常工作。 请、有人能帮我解决这个问题吗? 我想通过 MSP430f6736控制器读取 ADS1298放大器的器件 ID。 我需要使用一些端口映射来使 SPI 正常工作(我已经完成了)。  

任务: 通过 MSP430f6736控制器读取 ADS1298放大器的器件 ID

通信:SPI - USCI B0

其他说明:使用端口映射

代码:

#include 

#include 



void init (void){



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

//_BIC_SR_register (GIE); //在配置和初始化期间禁用中断





//设置 P2.4、P4.2、P4.3、P4.5、P5.0、 P5.1引脚作为 GPIO 及其方向

// SPI SIMO、SOMI、CLK 未被定义、因为它们在端口映射完成后由 USCI 模块定向(代码请见下面)

// SPI 片选、AMP 复位设置为其工作条件

P1SEL &=~BIT0; //将 P1.0设置为 I/O (您可以注释此行)

P1DIR |= BIT0; //将 P1.0、'AMP PWDN'设置为输出



P2SEL &=~BIT4; //将 P2.4设置为 I/O (您可以注释此行)

P2DIR |= BIT4; //将 P2.4、'SPI chip select'设置为输出



P4SEL &=~(BIT2 + BIT3 + BIT5); //将 P4.2 P4.3 P4.5设置为 I/O (您可以注释此行)

P4DIR |=(BIT2 + BIT3); //将 P4.2、'AMP CNV start'和 P4.3'AMP reset'设置为输出

P4DIR &=~BIT4; //将 P4.5、'AMP DRDY '设置为输入



P5SEL &=~(BIT0 + BIT1); //将 P5.0 P5.1设置为 I/O (您可以注释此行)

P5DIR |=(BIT0 + BIT1); //将 P5.0、'LED1'和 P5.1、'LED2'引脚设置为输出



//--初始 PIN 值--

//引脚的逻辑不应通过 OUT 进行更改以进行操作

P1OUT |= BIT0; //将 AMP PWDN 更改为"1"以不关闭 ADS1298芯片的电源

P2OUT |= BIT4; // SPI 片选为'1'取消选择片选

P4OUT |= BIT3; // AMP 复位为“1”,不通过 OUT 激活它



//可根据需要在程序中更改的输出值

P4OUT &=~BIT2; //将 P4.2、'AMP CNV start'设置为低电平。 这将不会启动 CNV、也不会发出 DRDY SIG

P4OUT &=~BIT4; //将 P4.5设置为"AMP DRDY "是输入、但将00作为惯例(无需)

P5OUT &=~(BIT0 + BIT1); //将 P5.0、'LED1'和 P5.1、'LED2'设置为关闭



_DELAY_CYCLES (20);



SPI 的//端口映射、如原理图所示

PMAPKEYID = 0x02D52; //通过解锁寄存器来启用端口映射



P2MAP1 = PM_UCB0SOMI; // P2.1 for SPI SOMI - USCI_B0SOMI

P2MAP2 = PM_UCB0SIMO; // P2.2 for SPI SIMO - USCI_B0SIMO

P2MAP3 = PM_UCB0CLK; // P2.3用于 SPI CLK - USCI_B0CLK



PMAPKEYID = 0; //锁定端口映射配置



//设置 USCI_B0 SPI 控制寄存器和其他相关寄存器

UCB0CTLW0 |= UCSWRST; // eUSCI 复位(为了避免不可预知的运行状态、需要执行此操作)

UCB0CTLW0 |=(UCMST + UCSYNC + UCCKPL + UCMSB); // 3引脚、8位、SPI 主控、MSB 第一个 CLK 高电平无效模式(配置)



// eUSCI 时钟源选择、这些位选择 BRCLK 源时钟

UCB0CTLW0 |= UCSSEL_2; //主控模式中的10b SMCLK。 请勿在从模式下使用(您可以使用此或)

//UCB0CTLW0 |= UCSSEL_3; // 11b SMCLK 处于主控模式。 请勿在从模式下使用(这适用于应用)



//位时钟预分频器设置(fBitClock = fBRCLK / UCBRx;如果 UCBRx = 0:fBitClock = fBRCLK)

UCB0BRW_L = 0x02; ///3;检查应用程序的正确之处(此应用程序是否需要位时钟预分频器?)

UCB0BRW_H = 0; //检查应用程序的正确之处(此应用程序是否需要位时钟预分频器?)



//UCB0IE |=(UCTXIE + UCRXIE); //启用中断(可选)//针对第2节注释此内容

UCB0CTLW0 &=~UCSWRST; //初始化 eUSCI (返回到原始位置)



ADS1298芯片的//复位信号

P2OUT &=~BIT4; //芯片使能

P4OUT &=~BIT3; //将复位信号设置为"0"

P4OUT |= BIT3; //将复位信号设置为"1"

_DELAY_CYCLES (20);

P2OUT |= BIT4; //芯片禁用



//在 RDATAC 模式下唤醒器件时发送 SDATAC 命令

P2OUT &=~BIT4; //芯片启用 ADS1298

while (!(UCB0IFG & UCTXIFG)); //等待 TX 缓冲区为空

UCB0TXBUF = 0x11; //发送具有地址(1字节)的读取命令

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

_DELAY_CYCLES (10); //稳定

P2OUT |= BIT4; //芯片禁用 ADS1298



P5OUT |= BIT1; //端口初始化完成

_DELAY_CYCLES (100); //初始化所有

}





int SPIread (unsigned char addr){



//初始化变量

unsigned char address、val;



P5OUT &=~BIT1; //达到 SPIread

P2OUT &=~BIT4; //芯片启用 ADS1298

地址= 0x20 | addr;



while (!(UCB0IFG & UCTXIFG)); //等待 TX 缓冲区为空

UCB0TXBUF =地址; //发送具有地址(1字节)的读取命令

while (!(UCB0IFG & UCTXIFG)); //等待 TX 缓冲区为空

UCB0TXBUF = 0x00; //发送具有地址(2字节)的读取命令



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

while (!(UCB0IFG & UCRXIFG)); //等待 RX 缓冲区准备就绪

Val = UCB0RXBUF; //读取数据



_DELAY_CYCLES (20); //稳定

P2OUT |= BIT4; //芯片禁用 ADS1298



返回 val;

}





void setupReadMode (void){

P4OUT |= BIT2; //将 AMP 开始设置为'1'

while (!(P4IN &~BIT4)); //等待 DRDY 变为"0"

P2OUT &=~BIT4; //芯片启用 ADS1298

while (!(UCB0IFG & UCTXIFG)); //等待 TX 缓冲区为空

UCB0TXBUF = 0x12; //发送具有地址(1字节)的读取命令

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

_DELAY_CYCLES (20); //稳定

P2OUT |= BIT4; //芯片禁用 ADS1298

}





int main (void){



unsigned char 值= 0x00;



init();

setupReadMode();



while (value ==0){

值= SPIread (0x00); //读取 Devie ID

P5OUT ^= BIT0; //使用异或切换 P5.0

_delay_cycles (5000); //延迟

}



while (1){

P5OUT |= BIT0; //程序结束 这意味着已经有了一些值

P5OUT |= BIT1; //由 SPI 读取。 检查系统恢复器中的值

。}

}

通过 MSP430f6736控制器的 ADS1298放大器的器件 ID

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我建议使用 MSP-FET 之类的调试器单步执行您的代码、以确定和共享代码丢失的位置。 此外、使用逻辑分析仪监控 SPI 接口、以查看是否有任何内容发送到 ADS1298、这可能会有所帮助。

    此致、

    James

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

    此外、我没有看到 USCI_B0中断服务例程(ISR)、我看到您已经注释掉了 TX 和 RX 中断。 我建议取消注释、并将上面代码中的第119行移至第121行之后。 您可以在 用户指南的第40.3.1节中找到建议的 SPI 初始化和配置说明。 接下来、我建议您确认输出正确的 CLK 信号。 您可以使用示波器进行检查。 然后、我要确保您遵循 ADS1298数据表第11.1节(参见图105和表38)中的加电排序时序。

    希望这些建议能帮助您快速入门。

    此致、

    James

    MSP 客户应用

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

    感谢您的回复。 我使用调试器检查我的代码、发现端口映射与其默认值没有变化。 我不知道为什么会这样。 您能告诉我我端口映射中是否有问题、或者端口映射在调试器模式中是否没有指示?

    此外、我想在 ADS1298数据表第85页的图93中阐明这个序列:它提到 fCLK = 2.048MHz、这是否意味着主电源应该为那个值的时钟? 我的控制器具有32kHz 外部时钟、并且没有使用任何东西来提高时钟速率。

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

    你好,乌德什!

    您的 SPI 极性设置似乎错误。 ADS1298在 SCLK 的下降沿锁存数据。 您已设置 UCCKPL、这意味着 CLK 的空闲状态为高电平。 您没有设置 UCCKPH、因此数据在第一个边沿(下降)被更改、在第二个边沿(上升)被捕捉。 这将导致变速器出现故障。 您既不能设置 UCCKPL、也不能设置 UCCKPH。 我不会同时设置这两者。

    Dennis

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

    [引用 user="Udesh Egodage"]提到 fCLK = 2.048MHz[/quot]

    2.048MHz 与 SPI 时钟无关-它用于内部调制器。 此器件可由一个外部时钟频率(更加精确)驱动、但无需。

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

    我已更改 UCCKPL 并检查它不起作用的代码。 我已经了解了端口跳跃寄存器。 它们没有改变。 它们处于默认值。 我很困惑。 我不确定端口映射寄存器是否在调试模式下更新。 您能不能指导我、以便我可以将我的引脚连接到 SPI B0。 我无法更改引脚或任何硬件,因为它是定制的(而不是演示板)。

    谢谢、
    乌德什

    PS:我共享了一个包含调试模式寄存器行为的链接、如果这对您有所帮助。

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

    您好、Udesh、

    除了 Dennis 的反馈外、还实现了一个随每个(汇编器)指令递增的超时计数器、当计数为32时、写入访问会再次被锁定。 对端口映射控制器寄存器的任何访问都会将计数器复位。 在配置过程中应禁用中断、或者应用程序应采取预防措施、防止中断服务例程的执行意外地导致端口映射寄存器永久锁定;例如、使用重新配置功能(请参阅用户指南中的第13.2.2节)。

    Jens-Michael Gross 对调试如何在以下线程中影响这一点做了很好的解释。 基本上、您将需要在代码中检查 PMAP 配置而不使用断点(例如、使用 if ()语句检查/读取配置并打开 LED 等)。 一个断点或者在解锁和锁定之间的过多代码能够再次锁定寄存器。 由于 PMAPLOCKED 有一个超时、它在一个特定数量的 MCLK 周期后被自动复位。 使用断点时、调试器获取变量等。会导致 MCLK 周期数超过超时计数器、因此寄存器再次被 PMAPLOCKED 锁定。

    访问状态反映在 PMAPLOCK 位中。 默认情况下、端口映射控制器在 PUC 后仅允许一种配置。 通过写入正确的密钥来启用写入访问的第二次尝试被忽略、并且寄存器保持锁定状态。 需要一个 PUC 来再次禁用永久锁定。 如果有必要在运行时重新配置映射、则必须在第一次写入访问时隙期间设置 PMAPRECFG 位。 如果在以后的配置会话期间清除了 PMAPRECFG、则不可能再进行配置会话。 上面链接的线程中的代码是有关应如何更改 PMAP 寄存器的良好示例。

    此致、

    James

    MSP 客户应用

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

    尊敬的 James 和 Dennis:

    感谢您的帮助和指导。 我能够使它正常工作。 代码中几乎没有问题、例如使  UCCKPL 变为低电平并使端口映射正常工作。 这个代码映射部分没有什么问题、也许我已经每次单步执行、这样映射就不会发生。 当我发送读取命令时、它会发送正确的命令、而我不想发送第二个字节。 因此、我不确定第二个字节是否有必要。 不管怎样、代码都能正常工作、感谢您的支持。

    谢谢、

    乌德什。