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.
大家好、我有一个 MSP430开发板、 MSP-EXP430F5529LP。 在我在这个论坛和网络上的其他地方进行的所有搜索中、似乎"3线"SPI MSP430支持的是时钟线路和数据输入/输出线路、但不支持从器件选择线路。 要使用从器件选择线路、您必须手动切换 GPIO 输出引脚。 这真的是真的吗???
尊敬的 Terence:
是的、通常第4个独立的从器件选择连接与3线模式一起使用。
BR、
Leo
是否无法使用 MSP430实现这一自动化?
理想情况下、我想在 MSP430上设置 SPI、这样我只需使用我希望发送的数据调用一个发送函数、外设将相应地自动切换从器件选择线路。 这就是它与我使用过的其他微控制器的工作方式。
但是、根据我所读的内容、MSP430似乎无法实现这一点。 似乎我需要手动将 GPIO 引脚切换为高电平/低电平以进行从器件选择。 我的理解是否正确?
尊敬的 Terence:
是的。 另一种选择是使用4线 SPI 接口。
BR、
Leo
我认为用户指南(SLAU208Q)第37.3节指出、对于4线制主器件、STE 引脚会自动切换。 不幸的是,我在第37章中看不到这方面的明确说明。 (eUSCI 具有 UCSTEM 功能、并且明确地说是这样。)
我不确定的原因是我从未在 MSP430上使用过4线制主器件、因为自动 STE 会在每个字节周围置位 STE、并且我使用的每个 SPI 从器件都要求在整个事务中置位 STE。 [参考 UG 图37-4和40-4]这不是 MSP430所独有的、大多数 SPI 主站都是这样工作的。
我之所以说出来、是因为:如果您的从器件在整个事务中需要将 STE 置为有效、则必须使用具有显式 GPIO 的3线制 STE (没有理由确定它是否起作用)。
如果您使用的是用于 STE (/CS)的 GPIO、则应使用3线模式。 在这种情况下、如果您使用4线制模式、则可能必须摆动(痕量) STE、以便 SPI 单元能够看到它所需的内容、这是一种痛苦、没有好处。 在3线制模式下、它完全忽略 STE。 在3线制模式下、您可以将标有 STE (作为 GPIO)的引脚用于/CS、或使用其他一些引脚、这是方便的。
[引用用户="Bruce McKenney47378"]
在3线制模式下、您可以将标有 STE (作为 GPIO)的引脚用于/CS、或使用其他一些引脚、这是方便的。
[/报价]
谢谢、Bruce。 不过、这是问题所在。 我的从外设需要 CS (片选)、我更愿意不必手动切换 CS 的 GPIO 引脚。 我之前使用过的每个其他微处理器都包含一个带有 SPI 的 CS 引脚、该引脚在数据发送前后自动切换、因此我很难理解为什么 MSP430不会切换。
我有一些时间来进一步调查。 我在 MSP430 DriverLib 文档中看到的是,它似乎不支持芯片选择行:(
如果您查看数据表、您会看到它似乎支持具有片选的4引脚 SPI (请参阅下面的寄存器字段 UCMODEx):
如果您看一下《适用于 MSP430F5xx_6xx 器件的 MSP430 DriverLib 用户指南》、您将看到 USCI_A_SPI_initMaster ()。 但是、如果您深入研究该函数的 DriverLib 代码、您会发现它不支持修改 UCMODE 寄存器字段:
bool USCI_A_SPI_initMaster (uint16_t baseAddress、USCI_A_SPI_initMasterParam * param) { //禁用 USCI 模块 HWREG8 (baseAddress + OFS_UCAxCTL1)|= UCSWRST; //重置 OFS_UCAxCTL0值 HWREG8 (baseAddress + OFS_UCAxCTL0)&=~(UCCKPH + UCCKPL + UC7BIT + UCMSB + UCMST + UCMODE_3 + UCSYNC); //重置 OFS_UCAxCTL1值 HWREG8 (baseAddress + OFS_UCAxCTL1)&=~(UCSSEL_3); //选择时钟 HWREG8 (baseAddress + OFS_UCAxCTL1)|= param->selectClockSource; HWREG16 (baseAddress + OFS_UCAxBRW)= (uint16_t)(param->clockSourceFrequency / param->desedSpiClock); /* *配置为 SPI 主模式。 *时钟相位选择、极性、MSB * UCMST =主控模式 * UCSYNC =同步模式 * UCMODE_0 = 3引脚 SPI * HWREG8 (baseAddress + OFS_UCAxCTL0)|=( param->msbFirst + param->clockPhase + param->clockPolarity + UCMST + UCSYNC + UCMODE_0 ); //无调制 HWREG8 (baseAddress + OFS_UCAxMCTL)= 0; 返回( STATUS_SUCCES); }
我的 SPI 代码如下所示:
#define SPICLK 500000 uint8_t transmitData = 0x00; void main (void) { //停止看门狗计时器 WDT_A_HOLD (WDT_A_base); GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN7); GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、GPIO_PIN4); GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、GPIO_PIN3); GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P3、GPIO_PIN2); //初始化主设备 USCI_A_SPI_initMasterParam param ={0}; param.selectClockSource = USCI_A_SPI_CLOCKSOURCE_SMCLK; param.clockSourceFrequency = UCS_getSMCLK(); param.desiredSpiClock = SPICLK; param.msbFirst = USCI_A_SPI_MSB_FIRST; param.clockPhase = USCI_A_SPI_PHASE_DATA_Changed_ONFIRST_captured_on_next; param.clockPolarity = USCI_A_SPI_CLOCKPOLARITY_INACT_LOW; 返回值= USCI_A_SPI_initMaster (USCI_A0_BASE、¶m); 如果(STATUS_FAIL =返回值){ 返回; } //启用 USCI_A_SPI 模块 USCI_A_SPI_ENABLE (USCI_A0_BASE); //配置端口引脚以复位从器件 //等待从器件初始化 _DELAY_CYCLES (100); //初始化数据值 transmitData = 0x00; //向从器件发送数据 while (1) { USCI_A_SPI_transmitData (USCI_A0_BASE、transmitData); transmitData++; } }
当运行我的代码并使用我的逻辑分析仪查看 MSP430的引脚时、我看到:
^正如预期的那样、P3.2 UCA0STE 上没有任何内容。 我甚至在调用 USCI_A_SPI_initMaster()后尝试手动设置寄存器字段,希望它能通过以下操作正确激活它:
UCA0CTL0 |= 0x1;
UCA0CTL0 |= UCMODE_2;
但这似乎不起作用、因为我的逻辑分析仪在执行此操作时根本不显示任何内容、甚至在 SCLK 或主输出线上也不显示。
MSP430是否有支持此功能的不同型号???
如果对此有任何想法,我们将不胜感激。
谢谢
您的原始信息似乎是正确的。 我可以告诉 USCI (如 F5529上所示)在任何模式下都不支持动态驱动 STE。 当 UCMODE=2或3时、STE 是一个到主器件的输入。 您必须自己驱动从属方/CS。
我尝试了4线制模式、但我使用了 REN 电阻器将 STE 拉至非活动状态(因此主器件处于活动状态)。 我成功地使用了这个事实告诉我 STE 是一个输入、因此您不会获得它来驱动从器件的/CS 引脚。 UG 表37-1中的另一个线索:当 UCMODE=2 (STE 低电平有效)使 STE 有效(低电平)使主器件处于非活动状态、即如果主器件集 STE 有效、它将停止(冲突)。
eUSCI (在最近的 MSP430器件中可见)支持使用 UCSTEM=1的自动 STE。 当 UCSTEM=0时、USCI 的运行方式似乎与 eUSCI 的运行方式相匹配。
以下是我使用的程序供参考:
#include int main (void){ WDTCTL = WDTPW | WDTHOLD; P3OUT |= BIT2; // STE P3REN |= BIT2; // mode=(0,0),主设备,MSB 优先,SYNC,4引脚(L), SMCLK UCA0CTL0 =(1*UCCKPH)|(0*UCCKPL)| UCMST | UCMSB | UCSYNC | UCMODE_2; UCA0CTL1 = UCSSEL_2 | UCSWRST; UCA0BRW = 2; // 500kHz,我猜 UCA0CTL1 &=~UCSWRST; P3SEL |=(BIT2 | BIT3 | BIT4);// STE、MISO、MOSI P2SEL |= BIT7; // SCK while (1) { P3OUT |= BIT2; // STE 无效,所以主器件激活 UCA0TXBUF = 0x55; while (UCA0STAT & UCBUSY)/* empty*/; P3OUT &=~BIT2; _DELAY_CYCLES (2*2*8); //范围 在 BRW=2时为2个字节的时间} /*NOTREACHED*/ 返回(0); }
好的、感谢 Bruce 的确认。 我将介绍一些 MSP430支持 eUSCI 的功能。