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.

[参考译文] MSP430F47187:在 USCI B1上初始化 SPI 时需要帮助

Guru**** 2589275 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/623809/msp430f47187-help-required-with-initializing-spi-on-usci-b1

器件型号:MSP430F47187

大家好、  

我正在尝试通过 SPI 端口(USCI B1)将 Microchip NOR 闪存(SST25VF080B)连接到 MSP43047187。  

同一端口最初连接到 SD 卡。 使用的引脚为 P2.1、P2.2和 P2.3。

目前尚未安装 SD 卡架,尽管所有线路上的上拉电阻器(10K)都已就位。

我在3引脚模式下使用 SPI。 从 硬件中的 P1.3和 P1.4派生出了 Ce#和 WP#、并在需要时进行位拆裂。  

我的问题是我无法初始化 SPI 总线本身。 我在 CLK、SIMO 或 SOMI 引脚上看不到任何活动。 只有使能引脚和 WP 引脚被切换、因为它们是位拆裂的。  

下面随附了初始化代码。  

// SPI 端口
#define SPI_SEL P2SEL
#define SPI_DIR P2DIR
#define SPI_OUT P2OUT
#define SPI_REN P2REN
// SPI 引脚
#define SPI_MOSI BIT1
#define SPI_MISO Bit2
#define SPI_CLK BIT3

// NOR 闪存引
脚#define NOR_CS BIT3
#define NOR_WP BIT4
#define NOR_HOLD BIT7
//#define NOR_HOLD BIT0

// NOR 闪存定义
#define NOR_CS_SELP1SEL
#define NOR_CS_OUTP1OUT
#define NOR_CS_DIRP1DIR
#defineNOT_CS_RENP1REN


void Init_SPI (void)
{
//初始化 SPI 主操作
的 USCI_B1 UCB1CTL1 = UCSWRST;//复位状态机

UCB1CTL0 = UCCKPH + UCCKPL + UCMSB + UCMST + UCSYNC;// 3引脚、8位 SPI 主
器件 UCB1CTL1 = UCSWRST + UCSSEL_2;//使用 SMCLK、保持在复位条件


UCB1BR0 = 80; //初始 SPI 时钟必须小于400kHz
UCB1BR1 = 0; // f_UCxCLK = 16MHz/40 = 400kHz

// NOR 闪存操作的端口初始化
SPI_SEL |= SPI_CLK + SPI_MISO + SPI_MOSI;//为分配
的引脚选择 SPI 功能 SPI_REN |= SPI_CLK + SPI_MISO + SPI_MOSI;//在 MISO +
SPI_MOSI 上启用内部上拉电阻| SPI_CLK + SPI_CLK + SPI_MOSI//将输出状态设置为 High
SPI_DIR |= SPI_CLK + SPI_MOSI;//配置为输出。
SPI_DIR &=~SPI_MISO;//配置为输入。

//时钟极性选择-无效状态为高
电平// MSB FIRST
UC1IE=0x00;
UCB1CTL1 &=~Ω UCSWRST; //从复位状态 UC1IFG 释放 USCI
&&~(UCB1RXIFG);
}//初始化 SPI 总线结束
失效 Init_NOR_Flash (void)
{
NOR_CS_SEL &=~(NOR_CS + NOR_WP);// CS 是普通 I/O 端口。
NOL_CS_OUT |= NOT_CS + NOT_WP;//芯片禁用模式
NOT_CS_REN |= NOT_CS + NOT_WP;
NOT_CS_DIR |= NOT_CS + NOT_WP;//芯片启用方向至输出模式。

NOR_HOLD_SEL &=~NOR_HOLD;
NOR_HOLD_OUT |= NOT_HOLD;
NOR_HOLD_DIR |= NOR_HOLD;

NOR_ENABLE;
_NOP ();
SEND_NOR_Command (NOR_WRDI);
NOT_DISABLE;
_NOP();
Flash_Lock ();
_NOP();
}

这些函数在 Main 中调用、如下所示:

void main (void)
{

unsigned int I;

WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器

FLL_CTL0 |= DCOPLUS; // DCO+设置、freq = xtal x D x N+1
SCFI0 = FLLD_4+FN_4; // x4 DCO 频率、16MHz 标称 DCO
SCFQCTL = 31; //(31+1) x 32768 x 4 = 4MHz
FLL_CTL1 |= XT2OFF + LFXT1DIG;

对于(I = 0;I < 10;I++)
延迟(10000);

//等待 xtal 以稳定
do
{
IFG1 &=~OFIFG; //清除 OSCFault 标志
对于(i = 500;i > 0;i-); //标志置位
}
while ((IFG1 & OFIFG)的时间; // OSCFault 标志

//等待电源稳定
SVSCTL = b0;
for (i = 0;i < 10000;i++);

while (SVSCTL & SVSFG)
{
SVSCTL &=~SVSFG;
for (i = 0;i < 10000;i++);
}

//切换到高速
FLL_CTL0 |= DCOPLUS; // DCO+设置、freq = xtal x D x N+1
SCFI0 = FLLD_4+FN_4; // x4 DCO 频率、16MHz 标称 DCO
SCFQCTL = 124; //(124+1) x 32768 x 4 = 16MHz
FLL_CTL1 |= XT2OFF + LFXT1DIG;

//等待 xtal 以稳定
DO
{
IFG1 &=~OFIFG; //清除 OSCFault 标志
对于(i = 10000;i > 0;i-); //标志置位
}
while ((IFG1 & OFIFG)的时间; // OSCFault 标志

FCTL2 = FWKEY + FSSEL0 + FN5 + FN4; //针对闪存时序发生器


P4SEL = 0x00的 MCLK/41; 为 P4
P4REN = 0x00选择了//i/o 功能;
P4DIR = 0xff; //所有输出
P4OUT = 0xff;
init_spi();
init_nor_Flash(); 

    while (1)

    {

    }

 

 

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

    是否确定代码退出时钟系统设置并正确处理 SPI 初始化? PxREN、PxOUT 和 PxDIR 寄存器不需要更改、因为端口引脚设置为 SPI 功能、并且不应安装外部上拉电阻器。 请确保按照数据表中所述为从器件使用正确的时钟相位和极性设置。 您也不会共享实际填充传输缓冲区的代码、因此很难进一步辨别问题。

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

    感谢您的回答。 抱歉,我的错… 我忘记添加该部件。
    TxBuf 已填充以下函数调用:

    您能否详细说明您的问题"是否确定代码退出时钟系统设置并正确处理 SPI 初始化?" 我不确定我是否理解您的意思。 我在初始化部分中缺少什么。上面的代码中显示了时钟初始化。
    此致
    Aniruddha

    /********
    *函数:Send NOR Command
    *说明:此函数将命令写入 NOR 闪存。
    *
    * Variables:采用一个字节作为命令变量。返回 none
    作者:Aniruddha Phadnis
    *创建时间:2017年8月23日
    秘书长的报告 /
    void Send_NOR_Command (unsigned char cmd)

    _dint();
    while (!(UC1IFG & UCB1TXIFG));//等待尚未为 TX 做好准备
    UCB1TXBUF = CMD;//写入字节
    while (UCB1STAT 和 UCBUSY); //等待所有 TX/RX 完成
    _EINT();
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Aniruddha、

    我是要询问您的代码在调试期间是否停留在任何特定的行。

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

    很抱歉耽误你的回答。 感谢您的建议。 实际上有三个问题、每一个问题都线性地相互关联。

    我不知道原因、但我必须实际为时钟和 SOMI 线路添加上拉电阻器。 这些最初是失踪的。 当我在示波器上检查这些线路时、我看到信号从未达到其被识别为高电平所需的电平(2.2V)。 杂散电容可能存在问题、有些地方、但暂时通过上拉电阻器解决了该问题。
    即使在使时钟和 SIMO 线正确切换后、仍然存在时钟相位和极性问题。
    甚至在得到它之后… 如果他们强调控制器本身不会为从器件响应生成时钟、那就更好了。 我正在等待控制器自行生成时钟。 从未发生过的情况。 数据表的许多读数都让我弄清楚了... 是的、可能是我很慢。
    此致
    Aniruddha