主题中讨论的其他器件: 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);
}

