MSP430x169 SPI 应用中出现问题,求大神帮助!!
[复制链接]
本帖最后由 paulhyde 于 2014-9-15 04:11 编辑
1.中断程序发送数据,只能发送2个8位数据。如果程序中写发送3个8位数据,则实际情况, 只发送第1个8位数据和第3个8位数据。
2.可以发送1个8位数,加上1个类似实例程序中的16位数,但是每发送一次,后面会发送一
次别的信号(8+16=24位,不知道哪来的)
我用的是dac8532,必须传送24位的数据
数据手册见附件
我的程序如下:
/*******************************************************************************
DA程序 MSP430F169 DAC8532 --------------- -------------- | P3.0 |- -| /SYNC | | | | | | SIMO0/P3.1 |- -| Din | | | | | | UCLK0/P3.3 |- -| SCLK | | | | |
*******************************************************************************/
#include <msp430x16x.h>
//============================================================================== unsigned char w_data_A=0x00; //写数据到缓存器 A unsigned char w_data_B=0x04; //写数据到缓存器 B unsigned char w_load_A=0x10; //从缓存器 A 输出到 A 通道 unsigned char w_load_B=0x24; //从缓存器 B 输出到 B 通道 //==============================================================================
void main(void) { WDTCTL = WDTPW + WDTHOLD; P3SEL |= 0x0A; // P3.1,P3.3 选择 SPI 模式 P3DIR |= 0x0B; // P3.0,P3.1,P3.3 设置输出 P3OUT &= ~0x01; // SYNC 复位 ME1 |= USPIE0; // 使能 USART0 SPI UCTL0 |= CHAR + SYNC + MM; // 8位数据,SPI模式,主机模式 UTCTL0 = CKPH + CKPL + SSEL1 + STC; // SMCLK,三线模式 /* CKPH = 1 UCLK时钟信号被延迟半个周期后用作SPICLK信号 CKPL = 1 时钟信号的高电平为无效电平,数据在UCLK的下降沿输出, 输入数据在UCLK的上升沿被锁存 (P236) */ UBR00 = 0x02; // 波特率选择(低八位) UBR10 = 0x00; // 波特率选择(高八位) UMCTL0 = 0x00; // 波特率调整 /* N = BRCLK/波特率, 整数部分低八位放入 UBR00,整数部分高八位放入 UBR10,数部分*8后的整数部分为8位调整寄存器中1的个位数,均匀分布 */ UCTL0 &= ~SWRST; // USART 初始化完毕 CCTL0 = CCIE; CCR0 = 64-1; // ~ 390Hz Clock period /* CCR0 = 定时时间 * 时钟源频率 - 1 */ TACTL = TASSEL_2 + MC_1; // SMCLK, 增计数模式 _BIS_SR(LPM0_bits + GIE); }
#pragma vector=TIMERA0_VECTOR // 定时器 A 中断程序 __interrupt void Timer_A(void) { P3OUT |= 0x01; // SYNC 置位 P3OUT &= ~0x01; // SYNC 复位 //随便发2个8位数据 TXBUF0 = 0x0f; TXBUF0 = 0x81; }
|