📄 uscia1_spi.c
字号:
# include "USCIA1_SPI.h"
void USCIA1_SPI_Device_INIT(void)
{
SPI_Master_PORT_INIT();
SPI_Master_INIT();
}
void SPI_Master_PORT_INIT(void)
{
UCA1_SPI_MOSI; //使用的是USCIA1,则复用端口为
UCA1_SPI_SCK; //P3.6及P5.0(UAC1CLK)
UCAI_SPI_OUT; //SCK和MOSI通为输出
SS_DIR_OUT; //SS
SS_HIGH; //SS平时为高,只在发送数据期间
//为低
CS_DIR_OUT; //CS选通端口
CS_ALL_HIGH;
}
void SPI_Master_INIT(void)
{
UCA1CTL1 |= UCSWRST;
//UCCKPH
UCA1CTL0 |= UCCKPL| UCMSB| UCMST| UCSYNC; //3-pin, 8-bit SPI master
UCA1CTL1 |= UCSSEL_2; //SMCLK
UCA1BR0 |= 0x02; //发送位速率选择,这里为SMCLK/2
UCA1BR1 = 0;
UCA1MCTL = 0; //该寄存器在SPI中应该被清除
UCA1CTL1 &= ~UCSWRST; //USCI复位取消,可以进行相关操作
UC1IE |= UCA1TXIE; //使能发送中断
//UCA1TXBUF = 0xf0; //启动SPI
}
void Update_SPI_Buffer(unsigned char* p_Data_Array,
unsigned char Data_SUM)
{
unsigned char i=0;
for(i=0; i<Data_SUM; i++)
{
SPI_Buffer[i]=p_Data_Array[i];
}
SS_LOW; //SS下降沿
UCA1TXBUF = SPI_Buffer[0];
}
void Set_DAC_Data(unsigned int DAC_Data, unsigned char Target_NUM)
{
unsigned char Data_Array[2]={0};
DAC_Data |= BITE;
DAC_Data &= ~BITD;
Data_Array[0] = DAC_Data>>8;
Data_Array[1] = DAC_Data;
CS_ALL_HIGH; //所有选通信号被禁止
switch(Target_NUM) //选通对应的ADC芯片
{
case 1:
CS0_LOW;
break;
case 2:
CS1_LOW;
break;
case 3:
CS2_LOW;
break;
}
Is_SPI_OK=0; //复位发送完毕标志
Update_SPI_Buffer(Data_Array, 2);
while(!Is_SPI_OK) //等待发送完毕
;
}
//发送中断向量有USCIAB0TX_VECTOR USCIAB1TX_VECTOR
//接受中断向量有USCIAB0RX_VECTOR USCIAB1RX_VECTOR
//A0和B0,A1和B1是公用中断向量的
//发送中断处理程序
#pragma vector=USCIAB1TX_VECTOR
__interrupt void USCIA1TX_ISR(void)
{
//while (!(UC1IFG & UCA1TXIFG)); //这个语句只在查询时使用
switch(SPI_NUM_New)
{
case 1:
{
UCA1TXBUF = SPI_Buffer[1]; //SPI_Buffer[1]为16位中的低8位
SPI_NUM_New++;
break;
}
case 2:
{
SS_HIGH; //16位数据发送完毕,SS上升沿
SPI_NUM_New = 1;
UC1IFG &= ~UCA1TXIFG; //软件清除中断标志,否则中断程序
//将一直被执行
Is_SPI_OK=1; //发送完毕标志置位
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -