器件型号:MSP432P401R
工具/软件:Code Composer Studio
我正在编写一个 SPI 驱动程序来与加速计通信、我编写了下面给出的代码。 我面临的问题是:
a)我无法找到 MSP432板上的所有 P1.4 - P1.7
b)是否有人检查我的代码、指出我的 SPI (特别是比特率)配置以及读写字节函数中的任何错误。
C)我对 STE 的使用感到困惑、因为 STE 只不过是芯片选择信号、所以我们无法直接使用端口引脚(GPIO)来根据要求将其直接设为低电平或高电平、而不是将其中一个端口引脚设为 STE
代码:
/**
*@文件 spi.c
*@简述此文件用于设置微控制器的 SPI 外设。
*@作者:Vikrant Waje
*@日期:2018年11月20日
*
*
//
//包含文件
//
#include"main.h"
//
//全局变量
//
//
//函数实现
//
/*------------------ *
/*
μ@简介:设置 SPI 外设。
@param:无
@参数:无
@返回:无
*
/*------------------ *
void SPI_setup(){
SPI_GPIO_setup();
spi_set_parameters ();
SPI_ENABLE();
}
/*------------------ *
/*
μ@简介:将 GPIO 分配给 SPI 外设。
SOMI = P1.7 (UCSI B)(SEL1 =0,SEL0=1)
SIMO = P1.6 (UCSI B)(SEL1 =0、SEL0=1)
CLK = P1.5 (UCSI B)(SEL1 =0、SEL0=1)
STE = P1.4 (UCSI B)(SEL1 =0、SEL0=1)
@param:无
@参数:无
@返回:无
*
/*------------------ *
void SPI_GPIO_setup(){
P1->SEL0 |=(BIT4 | BIT5 | BIT6 | BIT7);
}
/*------------------ *
/*
@简介:设置 SPI 外设的参数。
@param:无
@参数:无
@返回:无
*
/*------------------ *
void SPI_SET_parameters (){
//启用复位、MSB 优先、7位模式、主控、SPI 模式、STE =0、同步位、SMCLK 作为源时钟、STE 作为从器件选择
EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SWRST | EUSCI_B_CTLW0_MSB | EUSCI_B_CTLW0_SEVENBIT | EUSCI_B_CTLW0_MST | EUSCI_B_CTLW0_MODE_2 |\
EUSCI_B_CTLW0_SYNC | EUSCI_B_CTLW0_ssel_SMCLK | EUSCI_B_CTLW0_STEM;
EUSCI_B0->BRW = 120;
EUSCI_B0->CTLW0 &=~(EUSCI_B_CTLW0_SWRST);//退出复位
}
/*------------------ *
/*
μ@简介:为 SPI 外设写入字节。
@param:无
@参数:无
@返回:无
*
/*------------------ *
void SPI_WRITE_BYTE (uint8_t reg_addr、uint8_t DATA_BYTE){
P1->OUT &=~(BIT4);//将 CS 设为低电平
EUSCI_B0->TXBUF =(0<7)&(REG_addr);//发送寄存器地址、写入位在 MSB 位置(WRITE 位= 0)
while (!(EUSCI_B0->IFG & EUSCI_B_IFG_TXIFG);//等待字节被传输
EUSCI_B0->TXBUF = DATA_BYTE;
while (!(EUSCI_B0->IFG & EUSCI_B_IFG_TXIFG);//等待字节被传输
EUSCI_B2->IFG &=~(EUSCI_B_IFG_TXIFG0);//清除标志
P1->OUT |=(BIT4);//将 CS 设为高电平
}
/*------------------ *
/*
μ@简介:读取 SPI 外设的字节。
@param:reg_addr:要从中读取数据的寄存器地址
@参数:无
μ@返回:uint8_t:从寄存器读取的8位数据
*
/*------------------ *
uint8_t SPI_READ_BYTE (uint8_t REG_addr){
uint8_t DATA_BYTE;
P1->OUT &=~(BIT4);//将 CS 设为低电平
EUSCI_B0->TXBUF =(0<7)&(REG_addr);//发送寄存器地址、写入位在 MSB 位置(WRITE 位= 0)
while (!(EUSCI_B0->IFG & EUSCI_B_IFG_TXIFG);//等待字节被传输
EUSCI_B2->IFG &=~(EUSCI_B_IFG_TXIFG0);//清除标志
while (!(EUSCI_B0->IFG & EUSCI_B_IFG_RXIFG);//等待字节被传输
DATA_BYTE = EUSCI_B0->RXBUF;//从 RXBUF 读取数据
P1->OUT |=(BIT4);//将 CS 设为高电平
返回 DATA_BYTE;
}