主题中讨论的其他器件: MSP430FR2355、 TIDA-00648、 TIDM-01000
早上好、
MCU MSP430FR2355和 DAC161S997之间的通信存在一些问题。
我的目标是简单地在 DAC 输出上对我想要的电流进行编程。
现在、我在环路上获得2.119mA 电流-(尽管我在代码中要求5mA)。 ERRB 为低电平、因此在某个位置存在误差...
为了进行测试、我使用2个中断来读取寄存器0x09和0x05 (因此我发送了命令0x89和0x85)。
我尝试发送
0x89 0x5555 0x02 0xDEAD (读取状态和 NOP)
我在 MISO 0x20 0xDEAD 0x89 0x00E1上得到("1"表示环路错误)
当我发送0x85 0x5555 0xDEAD (读取错误配置和 NOP)和时
我在 MISO 上得到:0x20 0xDEAD 0x85 0x00F1 (没关系)
SPI 时序似乎正确。
我使用"MSP430FR2355 LaunchPad"对 MCU 进行编程。 当系统仅通过 Launchpad (仅3V3)通电时,ERRB 会变高(因此没有错误)。 但是、当我为整个系统供电时(通过 LOP+/ LOP-)、ERRH 会降低。
我是否错过了任何内容或可以测试的内容?
如果可以的话、我在下面附上了程序和原理图。 我使用 TIDA-00648和 TIDM-01000作为参考。
有人能帮我解决这个问题吗?
我是微控制器的初学者、这可能是一个愚蠢的错误。
此致、
Christophe Felder
------
#include #include #include #include "DAC161.h" volatile int flag_4mA = 0; volatile int flag_20mA = 0; unsigned char DAC_Error_Processing; unsigned char dacStatus = 0; void USCIA1_Init (void); unsigned char USCIA1_SPI_WriteByByByByByByte (unsigned char Data); unsigned char DAC161_read_Status ( 161);unsigned char lengthchar WriteReg (ved char *、unsigned char WriteReg) void Setup_DAC161 (unsigned short errConfig、unsigned short errLow_uA、unsigned short errHigh_uA); void main (void){ volatile int i=0; WDTCTL = WDTPW | WDTHOLD; //停止看门狗定时器 PM5CTL0 &&=~LOCKLPM5; USCIA1_Init(); P4DIR &&~BIT0; //输入引脚 P4IES |= BIT0; //高到低边 沿 P4IFG &=~0xFF; //清除任何挂起的中断 P4IE |= BIT0; //启用中断 P3OUT &=~BIT7; //清除 P3.7输出锁存器以显示已定义的上电状态 P3DIR |= BIT7; //将 P3.7设置为输出方向 P1DIR &=~BIT0; //将 P1.0设置为输入 P1IE |= BIT0; P1IES |= BIT0; P1IFG &=~BIT0; // P1.0 IFG 清除 P1DIR &=~BIT1; //将 P1.1设置为输入 P1IE |= BIT1; P1IE|= BIT1; P1IFG &=~BIT1; // P1.1 IFG 清除 __bis_SR_register (GIE); //输入 LPM0,带中断 SETUP_DAC161 (DAC161_STD_ERR_CONFIG_STOPEND、3000、22000); //配置 DAC161 DAC_Error_Processing = 0; DAC161_SET_OUT_Value (5000);//不工作 DAC161_Nop (); __DELAY_CYCLES (5000); while (1){ IF (DAC_Error_Processing){ //在此处执行 DAC 错误处理 DAC_Error_Processing = 0; dacStatus = DAC161_READ_Status (); //读取状态以清除错误 } } #pragma vector=Port1_vector __interrupt void Port_1 (void) { switch (__even_in_range (P1IV、16)) { 案例0:break;//无中断 案例2: FLAG_20mA = 1; P1.0上的//中断 P2OUT &=~BIT1; //CS DAC = 0 USCIA1_SPI_WriteByte (0x89); //读取状态 USCIA1_SPI_WriteByte (0x55); USCIA1_SPI_WriteByte (0x55); P2OUT |= BIT1; //CS DAC = 1. DAC161_NOP (); //读取状态 P1IFG &=~BIT0; //清除标志 break;// P1.0 case 4:// P1.1上的中断 flag_4mA=1; P2OUT &=~BIT1; //CS DAC = 0 USCIA1_SPI_WriteByte (0x85); //读取 ERR CFG USCIA1_SPI_WriteByte (0x55); USCIA1_SPI_WriteByte (0x55); P2OUT |= BIT1; DAC161_NOP (); P1IFG &=~BIT1;//CS DAC = 1. break;// P1.1 } #pragma vector=Port4_vector __interrupt void Port_4 (void){ if (P4IFG & BIT0){// DAC 发生了错误? (ERRB -> 0) DAC_Error_Processing = 1; } P4IFG = 0; } void USCIA1_Init(void){ P4SEL0 |= BIT1 + BIT2 + BIT3;//配置 MOSI MISO SCK P2OUT &=~BIT1; //CS_DAC P2DIR |= BIT1; UCA1CTL1 |= UCSWRST; //启用 SW 复位 UCA1CTLW0 = UCMST + UCSSEL_SMCLK + UCMSB + UCSYNC + UCSWRST;// SPI 主设备,3线,同步模式 UCA1BR0 = 0; // SMCLK/1 = SCLK (1MHz) UCA1BR1 = 0; UCA1CTL1 &=~Ω UCSWRST; //清除 SW 复位,恢复操作 } unsigned char USCIA1_SPI_WriteByte (unsigned char 数据){ while (!(UCA1IFG&UCTXIFG)); // USCI_A1 TX 缓冲器就绪? UCA1IFG &=~UCRXIFG; //清除 RX 中断标志 UCA1TXBUF = DATA; // 在(!(UCA1IFG & UCRXIFG)时将数据放置在 TX 缓冲区中;//等待数据接收结束 返回((unsigned char) UCA1RXBUF); //从 RX 缓冲 器返回接收到的字节} unsigned char DAC161_read_Status (void){ //读取 DAC 状态 unsigned char returnValue[3]; DAC161_READ_Regs (returnValue、DAC161_STATUS_REG、2); return (returnValue[2]); } void DAC161_Write_Regs (unsigned short * writeValues、unsigned char startReg、unsigned char lengthBytes){ unsigned char outData[3]; outData[0]= DAC161_SPI_WRITE_CMD (startReg); outData[1]=* writeValues >> 8; outData[2]=* writeValveData + USC1; outlength1;outData //为命令字节的长度添加1 } void Setup_DAC161 (unsigned short errConfig、unsigned short errLow_uA、unsigned short errHigh_uA){ unsigned short errValue; DAC161_Write_Regs (&errConfig、DAC161_ERR_CONFIG_REG、2); errValue = DAC161_convert (errLow_uA 和 err16) ;DAC161_Err_Write_Regs (&r_Err100_Err_Err_Err_Err_uA) errValue = 0x80; DAC161_Write_Regs (&errValue、DAC161_ERR_HIGH_REG、2); }