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.
用MSP430F448的SPI接口对GP21进行配置时,在发送和接收的过程中,可进入SPI的接收中断和发送中断,但是接收到的数据一直为0。
GP21采用四线SPI接口,Clock Phase Bit = 1,Clock Polarity Bit = 0,当F448的SPI设为四线时,不能进入发送和接收中断,改为三线后,将STE脚作为普通IO实现对GP21中SPI接口SSN的控制(发送和接收数据时将STE脚置低,发送接收完成后置高),此时可进入发送和接收中断。SPI的其他设置为:波特率为9600,ACLK做参考时钟,8位数据,UxTCTL |= CKPH; UxTCTL &=~ CKPL;
另,将F448中SPI寄存器UxCTL |= LISTEN时,可接受到与发送相同的数。
本人是菜鸟,SPI配置程序是从网上下载的。想问一下,我是否能确定已将F448的SPI接口配置正确,能正常工作?
/*---------------------------------------------------------------- * **----------------------------------------------------------------*/ #include <msp430f448.h> #include "Spi.h" /***********************************�궨��*********************************/ #define UxCTL U0CTL #define UxRCTL U0RCTL #define UxTCTL U0TCTL #define UxBR0 U0BR0 #define UxBR1 U0BR1 #define UxMCTL U0MCTL #define UxRXBUF U0RXBUF #define UxTXBUF U0TXBUF #define UxME U0ME #define UxIE U0IE #define UxIFG U0IFG #define USPIEx USPIE0 #define URXIEx URXIE0 #define UTXIEx UTXIE0 #define USARTxTX_VECTOR USART0TX_VECTOR #define USARTxRX_VECTOR USART0RX_VECTOR #define USPI3ON P3SEL |= 0X0E //SPI 0�ĵڶ����ܴ�(����ģʽ) #define USPI4ON P3SEL |= 0X0F //SPI 0�ĵڶ����ܴ�(����ģʽ) #define SSN0 P3OUT &= 0xFE //P3.0=0 #define SSN1 P3OUT |= 0x01 //P3.0=1 /**************************************************************************/ char TxFlag_Spi=1; char RxFlag_Spi=0; /**************************************************************************** * �� �ƣ�SpiMasterInit * �� �ܣ���ʼ��SPI�����ò����ʵȣ�����ģʽ * ��ڲ����� * baud: ������ (300~500k) ֻ���Ǵ���ʹ��ʱ�ӵ�������Ƶ��spiģʽUxMCTL�Ĵ�����Ч ��Ϊ������Ƶ������Ƶϵ����Ϊ �������֣�����֧��С���� Ƶ datsBits: ����λλ�� (7��8) mode: ֹͣλλ�� (3��4) 3������ģʽ 4������ģʽ clkMode ʱ��ģʽ (0-3) ����ʱ�ӵļ��Ժ���λ 0�� �����ط��ͣ��½��ؽ��� ����UCLK 1�� �½��ط��ͣ������ؽ��� ����UCLK 2�� �½��ط��ͣ������ؽ��� ��ʱ�������UCLK 3�� �����ط��ͣ��½��ؽ��� ��ʱ�������UCLK * ���ڲ���������ֵΪ1ʱ������ɹ���Ϊ0��ʾ�����д��� ****************************************************************************/ char SpiMasterInit(long baud,char dataBits,char mode,char clkMode) { long int brclk; //�����ʷ�����ʱ��Ƶ�� UxCTL |= SWRST; //��ʼ //����ѡ��λ��Ϊ1�����͵������Լ����գ����ڲ��ԣ�����ʹ��ʱע�͵� //UxCTL |= LISTEN; UxCTL |= SYNC + MM; //SPI ����ģʽ //ʱ��Դ���� UxTCTL &=~ (SSEL0+SSEL1); //���֮ǰ��ʱ������ if(baud>=300 && baud<=115200) // { UxTCTL |= SSEL0; //ACLK�������� brclk = 32768; //�����ʷ�����ʱ��Ƶ��=ACLK(32768) } //------------------------���ò�����------------------------- else if(baud < 300||baud > 115200) //�����ʳ�����Χ { return 0; } //���ò����ʼĴ��� int fen = brclk / baud; //��Ƶϵ�� //if(fen<2)return (0); //��Ƶϵ���������2 if(fen>=2) { UxBR0 = fen / 256; UxBR1 = fen % 256; } //------------------------��������λ------------------------- switch(dataBits) { case 7:case'7': UxCTL &=~ CHAR; break; //7λ���� case 8:case'8': UxCTL |= CHAR; break; //8λ���� default : return(0); //�������� } //------------------------����ģʽ--------------------------- switch(mode) { case 3:case'3': //����ģʽ P3.1-P3.3�ֱ��SPI��SI��SO��SCK UxTCTL |= STC; P3SEL |= BIT1+BIT2+BIT3; P3SEL &= ~BIT0; //P3.0=SSN P3DIR |= BIT0+BIT2+BIT3; break; case 4:case'4': //����ģʽ P3.0-P3.3�ֱ��SPI��SSN��SI��SO��SCK UxTCTL &=~ STC; P3SEL = 0x0f; P3DIR = 0x0b; break; default : return(0); //�������� } //------------------------����UCLKģʽ----------------------- switch(clkMode) { case 0:case'0': UxTCTL &=~ CKPH; UxTCTL &=~ CKPL; break; //ģʽ0 case 1:case'1': UxTCTL &=~ CKPH; UxTCTL |= CKPL; break; //ģʽ1 case 2:case'2': UxTCTL |= CKPH; UxTCTL &=~ CKPL; break; //ģʽ2 case 3:case'3': UxTCTL |= CKPH; UxTCTL |= CKPL; break; //ģʽ3 default : return(0); //�������� } UxME |= USPIEx; //ģ��ʹ�� UCTL0 &= ~SWRST; // Initialize USART state machine UxIE |= URXIEx + UTXIEx; // Enable USART0 TX RX interrupt return(1); //���óɹ� } /**************************************************************************** * �� �ƣ�UartLpm * �� �ܣ�������/���ȴ������У���ʱ��ϵͳ�IJ���ʱ�Ӹùص������ʡ�� * ��ڲ������� * ���ڲ������� * ˵ ��: �������������ʱ�ӳ�ͻ����ע�͵�ú������������ӹ��ġ� ****************************************************************************/ void SpiLpm() { if(UxTCTL&SSEL0) LPM3; //����ACLK ��ʱ�ӣ�����LPM3����(����ACLK) else LPM0; //����SMCLK��ʱ�ӣ�����LPM0����(���ر�SMCLK) } /**************************************************************************** * �� �ƣ�UartWriteChar * �� �ܣ���дһ���ֽ����� * ��ڲ�����c: �����͵�һ�ֽ����� * ���ڲ������� * ˵ ��: �ڵȴ�������ϵĹ����У�CPU������ ****************************************************************************/ void SpiWriteDat(char c) { SSN0; while (TxFlag_Spi==0) SpiLpm(); // �ȴ���һ�ֽڷ��꣬������ TxFlag_Spi=0; // UxTXBUF=c; SSN1; } /**************************************************************************** * �� �ƣ�UartReadChar * �� �ܣ��Ӵ��ڶ�ȡ1�ֽ����� * ��ڲ������� * ���ڲ������յ���һ�ֽ����� * ˵ ��: �������û�����ݣ���һֱ�ȴ����ȴ������У�CPU������ ****************************************************************************/ char SpiReadDat() { SSN0; while (RxFlag_Spi==0) {}; // �յ�һ�ֽ�? RxFlag_Spi=0; return(UxRXBUF); SSN1; } /**************************************************************************** * �� �ƣ�SpiWriteData * �� �ܣ��з��ص�д�� * ��ڲ�����c: �����͵�һ�ֽ����� * ���ڲ�����char��д���ͬʱ�յ����ֽ� * ˵ ��: SPI��ȫ˫��ͨ�ţ�ÿ�η��ͣ�����ʱ��Ҳ�ڽ��գ�������ɺ�İ��ʱ�� * ���ں���һ���ַ�������ַ�Ҳ����Ǵ��豸���صģ��������ź��� * ��Ĭ�ϵ�ƽ������ʵ������жϣ���ֻ�������ʱ��ҲҪ�ô˺��������� * û��ʱ���ṩ�����豸�����ܶ������ݣ�ǿ�ҽ���ʹ��ʱ�����ͽ���ֻ�� * �˺����������ȡ�Ŀ�������һ�β������ַ� \0��Ĭ�ϵ�ƽ�� ****************************************************************************/ char SpiWriteData(char c) { SpiWriteDat(c); return SpiReadDat(); } /**************************************************************************** * �� �ƣ�UartRx * �� �ܣ����ڽ����жϣ�ÿ���յ�1�ֽڻᷢ��һ���ж� ****************************************************************************/ #pragma vector=USARTxRX_VECTOR __interrupt void SpiRx() { char a; RxFlag_Spi=1; a=UxRXBUF; __low_power_mode_off_on_exit(); } /**************************************************************************** * �� �ƣ�UartTx * �� �ܣ����ڷ����жϣ�ÿ����1�ֽڻᷢ��һ���ж� ****************************************************************************/ #pragma vector=USARTxTX_VECTOR __interrupt void SpiTx() { TxFlag_Spi=1; __low_power_mode_off_on_exit(); }
我写的 MSP430F44X单片机SPI接口驱动C语言程序。。希望对你有帮助。。
#include<msp430x44x.h>
char MST_Data=0X00,SLV_Data=0XFF;
void Init(void);
void main(void)
{
unsigned int i;
WDTCTL=WDTPW+WDTHOLD;
Init();
_EINT();
P3OUT&=~0X020;
P3OUT|=0X020;
i=50000;
do(i--);
while(i!=0);
while(1)
{
TXBUF0=MST_Data;
LPM0;
}
}
void Init(void)
{
P1OUT=0X000;
P1DIR=0X001;
P3SEL=0X00E;
UCTL0=CHAR+SYNC+MM+SWRST;
UTCTL0=STC+SSEL1+CKPL;
UBR00=0X02;
UBR01=0X00;
UMCTL0=0;
ME1=USPIE0;
UCTL0&=~SWRST;
IE1=URXIE0;
}
#pragma vector=USART0RX_VECTOR
__interrupt void SPI0_rx(void)
{
P3OUT^=0X010;
while ((IFG1&UTXIFG0)==0);
if (U0RXBUF==SLV_Data)
{
SLV_Data=SLV_Data-1;
MST_Data=MST_Data+1;
TXBUF0=MST_Data;
P1OUT|=0X001;
P1OUT&=~0X001;
}
else
{
TXBUF0=MST_Data;
P1OUT|=0X001;
}
}
chaosong huang1 谢谢你的回复,我还是想知道为什么我的程序中,既然能进接收中断为什么收到的全是0,是否向你的程序一样,初始化后加一个延时,还是SPI配置完成而是GP21没有工作?