请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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)
{
}