您能否提供此零件的工作示例SPI代码?
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.
我正在运行下面的代码,但总是返回所有0x0,即使我正在写入多个寄存器。 你看到我遗漏的东西了吗?
#include <MSP4S.h>
无符号字符MST_Data1,MST_Data2,SLV_Data;
无符号char temp,A2D_data1,A2D_data2,A2D_data3,A2D_data4,A2D_data5,A2D_data6,A2D_data7,A2D_data8;
内部主(无效)
{
易失性无符号int I;
WDTCTL = WDTPW+WDTHOLD; //停止看门狗计时器
//设置为从属设备重置的WFP 1.1
P1DIR |= 0xE0; //设置WFP 1.5 - 7
P4SEL || BIT4+BIT5; // WFP 3.3 ,4选项选择
P4SEL || BIT0; // WFP 2.7 选项选择
UCA1CTL1 |= UCSWRST; //**将状态机置于复位**
UCA1CTL0 || UCMST+UCSYNC+UCCKPL+UCMSB; // 3引脚,8位SPI主控制器
//时钟极性高,MSB
UCA1CTL1 |= UCSSEL_2; // SMCLK
UCA1BR0 = 0x02; ///2
UCA1BR1 = 0; //
UCA1MCTL = 0; //无调制
UCA1CTL1 &=~UCSWRST; //**初始化USCI状态机**
UCA1IE |= UCRXIE; //启用USI_A0 RX中断
P1OUT &=~0x20; //现已初始化SPI信号,
对于(i=50;i>0;i--);// 等待从属设备初始化
P1OUT |= 0x20; //重置A2D
对于(i=50;i>0;i--);// 等待从属设备初始化
MST_Data1 = 0x20; //初始化数据值
MST_Data2 = 0x08; //初始化数据值
SLV_Data = 0x00; //
P1OUT >=~0x80; // A2D CS LOW
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
UCA1TXBUF = 0x07; //重置A2D
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
//确保从属设备可以处理信息
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
UCA1TXBUF = 0x42; // OFC0
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
UCA1TXBUF = 0x01; // OFC0
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
UCA1TXBUF = 0x55; // OFC0
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
UCA1TXBUF = 0xAA; // OFC0
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
//确保从属设备可以处理信息
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
UCA1TXBUF = MST_Data1; //传输第一个字符
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
//确保从属设备可以处理信息
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
UCA1TXBUF = MST_Data2; //传输第一个字符
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
P1OUT |= 0x80; // A2D CS HIGH
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
__bis_sr_register(LPM0_bits + GIE); // CPU关闭,启用中断
}
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=USI_A1_vector
__interrupt void USI_A1_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (USI_A1_vector)) USI_A1_ISR (void)
#否则
错误编译器不受支持!
#endif
{
易失性无符号int I;
SWITCH(__EIV_IN_RANGE(UCA1IV,4))
{
情况0:中断; //矢量0 -无中断
案例2: //矢量2 - RXIFG
P1OUT >=~0x80; // A2D CS LOW
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
A2D_data1 = UCA1RXBUF;
UCA1TXBUF = 0x0; //发送下一个值
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
//确保从属设备可以处理信息
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
A2D_data2 = UCA1RXBUF;
UCA1TXBUF = 0x0; //发送下一个值
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
//确保从属设备可以处理信息
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
A2D_data3 = UCA1RXBUF;
UCA1TXBUF = 0x0; //发送下一个值
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
//确保从属设备可以处理信息
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
A2D_data4 = UCA1RXBUF;
UCA1TXBUF = 0x0; //发送下一个值
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
//确保从属设备可以处理信息
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
A2D_data5 = UCA1RXBUF;
UCA1TXBUF = 0x0; //发送下一个值
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
//确保从属设备可以处理信息
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
A2D_data6 = UCA1RXBUF;
UCA1TXBUF = 0x0; //发送下一个值
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
//确保从属设备可以处理信息
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
A2D_data7 = UCA1RXBUF;
UCA1TXBUF = 0x0; //发送下一个值
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
//确保从属设备可以处理信息
同时(!(UCA1IFG&UCTXIFG); // USI_A0 TX缓冲器就绪?
A2D_data8 = UCA1RXBUF;
UCA1TXBUF = 0x0; //发送下一个值
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
//确保从属设备可以处理信息
P1OUT |= 0x80; // A2D CS HIGH
对于(i=20;I>0; I--); //将两次传输之间的时间添加到
//确保从属设备可以处理信息
中断;
案例4:中断; //矢量4 - TXIFG
默认值:中断;
}
}
您好,Stephen:
我们很难通读某个人的部分代码并完全理解问题。 我们验证接口的最简单方法是查看逻辑分析器中ADS127L01 SPI信号的范围捕获。 其中包括SCLK,DIN,DOUT,/DRDY,/CS, 和CLK。
在尝试读取/写入ADS127L01之前,我建议验证所有电源和时钟信号是否如预期的那样存在。 只要您发送主时钟(CLK)并将启动拉高,您就应该注意到/DRDY针脚在以输出数据速率切换。 这表示ADC正在转换和输出新数据。 您是否已验证此信息?
请提供ADS127L01上所有硬件模式引脚的配置以及电源电压和时钟输入频率。 如果您愿意,我可以查看您的示意图。
此致,