主题中讨论的其他器件:MSP430F6736、 MSP-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
