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.

[参考译文] CCS/MSP432P401R:msp432

Guru**** 2044370 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/748680/ccs-msp432p401r-msp432

器件型号: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;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Vikrant、

    回答您的问题:
    a)我无法找到 MSP432电路板上的所有 P1.4 - P1.7 =>不确定您在这里要求什么-您是否尝试找到 LaunchPad PCB 上的引脚? 注意:P1_4不容易连接、因为它在按钮2上-有关详细信息、请参阅 Launchpad 用户指南 slau597f.pdf
    b)是否有人检查我的代码、指出我的 SPI (特别是比特率)配置以及读写字节函数中的任何错误。
    ->抱歉、无法完全检查您的代码、但您应该检查您在某些地方使用的语法、例如
    EUSCI_B0->TXBUF =(0<7)&(RESPos);
    ->您将0向左移7次、仍然为0、您和这与某种情况相同->结果仍然为0 ->因此您传输0
    C)我对 STE 的使用感到困惑、因为 STE 只是一个芯片选择信号、所以我们无法直接使用端口引脚(GPIO)来将其设为低电平
    而不是将其中一个端口引脚设置为 STE
    如您在 SPI -主模式-图 eUSCI 主控和外部受控(UCSTEM = 0)的 MSP432用户指南部分所见:STE 信号的主控侧输出为端口引脚。 STE 作为 MSP430中 SPI 的函数只能在受控模式下使用。

    此致、
    Stefan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因此、由于我将使用主模式、我从您的帖子中了解到、我只需要在 PxSEL 寄存器中配置 UCSIMO、UCSOMI 和 UCCLK。 芯片选择信号可以是任何通用 GPIO、我可以根据要求对其进行操作。 是这样吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、正确。

    ~ Stefan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我担心的另一个小问题是 UCCTLW0寄存器中的 UC7BIT 是否被置位。 我的传感器需要7位寻址、而每个数据包的长度为8位。 我将 UC7BIT 保持为1、假定它意味着我使用的地址是7位、而不是数据。
    此外、我是否需要手动发送读取和写入位、或者 USCI 模块是否会以某种方式处理它?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    SPI 的工作方式与 μ I²C 不同。 每当您写入 TXBUF 时、主器件将生成8 (或7)个时钟周期、并且在每个周期中、在 MOSI 上传输一个位、在 MISO 上读取一个位。 所有内容都是同时进行写入和读取。 就 SPI 协议(和 USCI 模块)而言就是这样。

    R/W 位是您的传感器在 SPI 上实现的某种协议。 第一个字节包含8位、因此您必须告诉 USCI 模块发送8位。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Vikrant、

    您对此主题还有其他疑问吗? 如果不是、请为解决您的问题的帖子选择"已解决"、以便关闭此主题。 如果您有其他问题、请选择"提出相关问题"或"提出新问题"。
    非常感谢!

    此致、
    Stefan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    解决了我的问题