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.

[参考译文] MSP430G2553:连接 MSP430G2553与 Winbond SPI (W25Q80BV)

Guru**** 2540720 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/570675/msp430g2553-interfacing-msp430g2553-with-winbond-spi-w25q80bv

器件型号:MSP430G2553

是否有人可以帮助我如何将 MSP430G2553与 Winbond SPI (W25Q80BV)连接? 我正在尝试使用 USCI。 我自己尝试过、也尝试在线参考示例、但每当我在调试模式下运行时、我定义了用于存储来自 SPI 的值的变量、只读 255 "xff"。 是否有任何人拥有可以提供帮助的工作代码?

这是我目前使用的代码(请记住、它实际上并未进行优化、因为我只是想让某个代码正常工作):

#include "msp430g2553.h";

unsigned char address sValue;

/*
* main.c
*
int main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

initspi();

address 值=读取(0x00);

while (1);

返回0;

//为 SPI 配置 MSP430
/**
*使用 UCA0
*
* MSP_PIN 1.1 = SPI_PIN 2 (数据输出)
* MSP_PIN 1.2 = SPI_PIN 5 (数据输入)
* MSP_PIN 1.4 = SPI_PIN 6 (CLK)
* MSP_PIN 1.5 = SPI_PIN 1 (CS)
*
*
void initSPI(){

// PIN 设置
P1OUT |= BIT5;
P1DIR |= BIT5;
P1SEL = BIT1 | BIT2 | BIT4;
P1SEL2 = BIT1 | BIT2 | BIT4;

/**
*设置 UCACTL (UCA 控制)寄存器
*这会将微控制器设置为使用 SPI 接口
*
UCA0CTL1 = UCSWRST;//复位模式
UCA0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC;// 3引脚8位 SPI 主器件(MOST SIG 位优先)
UCA0CTL1 |= UCSSEL_2;// SMCLK

UCA0BR0 |= 0x02;///2
UCA0BR1 = 0;//
UCA0MCTL = 0;//无调制

UCA0CTL1 &=~UCSWRST;//初始化 USCI 状态机


unsigned char read (unsigned char regAddress){

// CS High
//P1OUT |= BIT5;

// CS Low
P1OUT &=~BIT4;

/**
*向 SPI 发送读取命令
*
while (!(IFG2 & UCA0TXIFG));// TX 缓冲区准备就绪?
UCA0TXBUF = 0x03;//告知 SPI 我们要执行读取(03h)

/**
*发送要在其中获取数据的地址
*
while (!(IFG2 & UCA0TXIFG));// TX 缓冲区准备就绪?
UCA0TXBUF = regAddress;

INT 计数;

/**
*发送虚拟位
*
*
对于(count = 0;count < 7;count++){
while (!(IFG2 & UCA0TXIFG));// TX 缓冲区准备就绪?
UCA0TXBUF = 0x00;

unsigned char 结果;

/**
*从 SPI 读取值
*
*
while (!(IFG2 & UCA0RXIFG));// RX buffer ready?
结果= UCA0RXBUF;

//提起 CS 以取消选择驱动器
P1OUT |= BIT5;

返回结果;

/********* 结束代码

以下是 Winbond SPI  https://cdn-shop.adafruit.com/datasheets/W25Q80BV.pdf 的规格

我从规范中获取了下一个屏幕截图、因为它解释了 SPI 读取过程:

最后-这里是我在 SPI 上存储的内容的一部分。 长远来说、我的目标是尝试从第一个位开始读取每个位、直到达到一定的长度。

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

    [引用用户="Michael J"]
    while (!(IFG2 & UCA0TXIFG));// TX 缓冲区准备就绪?
    UCA0TXBUF = regAddress;

    数据表显示地址为24位。 您仅发送8位。

    [引用用户="Michael J"]/**
    *发送虚拟位
    *
    *
    对于(count = 0;count < 7;count++){
    while (!(IFG2 & UCA0TXIFG));// TX 缓冲区准备就绪?
    UCA0TXBUF = 0x00;
    }[/报价]

    您希望接收8位、那么为什么要发送64位(8字节)?

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

    Ilmars、

    您指出的代码段的目标是尝试提交24个字节。 为此、我发送了 regAddress (8位)、然后有一个 for 循环来提交虚拟位、以生成24位。 我看到我将计数设置为7、应该是2 (正如我在工作区中看到的那样)。 不过,这对我来说仍然不起作用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请注意、首先是地址的最高有效位。 如果要从地址0x05读取单字节、则应发送字节序列0x03 0x00 0x00 0x05 0xAB、其中0xAB -读取的数据的虚拟字节。 还要检查时序规格-可能芯片在 CS 置位后需要一段时间、因此您必须在发送命令之前添加(短)延迟。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ilmars

    这对我不起作用。  我仍然获得0xFF 输出。 数据表显示、0x03必须"移位"、之后是24位。 与 UCA0TXBUF = 0x03之类的操作相比、我应该做什么特别吗?

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

    [引用用户="Michael J"]我是否应该做一些特别的事情而不是像 UCA0TXBUF = 0x03那样做?

    您应检查 显示 SPI 用法的源代码示例

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

    您好、Michael、

    您可能对以下类似主题感兴趣: e2e.ti.com/.../565303

    https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/555814  

    此致、
    Ryan

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

    非常感谢、Ryan Brown1! 它提供了很多帮助。