在线时间2188 小时
UID2073122
注册时间2016-1-12
NXP金币838
TA的每日心情 | 开心 2020-6-18 08:45 |
---|
签到天数: 812 天 [LV.10]以坛为家III
金牌会员
- 积分
- 6156
- 最后登录
- 2024-5-5
|
本帖最后由 原来的你 于 2016-11-5 15:19 编辑
LPC824具有两个SPI接口,可以通过SPI接口与外部芯片通信,比如SPI flash存储芯片等。LPC824的SPI特点:
• 1-16位的数据帧被直接支持,更大的数据帧可结合软件来实现。
• 主/从模式。
• 支持发送数据到从设备时,无需读取进来的数据。这可用于外
接SPI存储器时。
• 可以选择将控制信息随着数据一起写入。这将允许实现多种功
能的操作,包括任意长度的数据帧的操作。
• 最多4条片选输入输出信号,且极性可选,使用灵活。
• 收发支持DMA。
• 支持低功耗模式(sleep/deep sleep/power down mode)唤醒。
• 注意:不支持TI的SSI和National的Microwire模式
SPI功能可以通过开关矩阵(switch matrix)来配置安排到所有数字引脚。建议:引脚PIO0_10和PIO0_11 (open-drain pins)不要用于SPI
/* Initializes pin muxing for SPI1 interface - note that SystemInit() may
already setup your pin muxing at system startup */
static void Init_SPI_PinMux(void) //初始化SPI1
{
#if (defined(BOARD_NXP_LPCXPRESSO_812) || defined(BOARD_LPC812MAX))
/* Enable the clock to the Switch Matrix */
Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);//打开开关矩阵时钟
/*
* Initialize SSP0 pins connect
* SCK1: PINASSIGN4[31:24]: Select P0.12
* MOSI1: PINASSIGN5[7:0]: Select P0.14
* MISO1: PINASSIGN5[15:8] : Select P0.6
* SSEL1: PINASSIGN5[23:16]: Select P0.13
*/
Chip_SWM_DisableFixedPin(SWM_FIXED_VDDCMP);//关闭开关矩阵VDDCMP功能
Chip_SWM_MovablePinAssign(SWM_SPI1_SCK_IO, 12);//选择P0.12作为SPI SCK1
Chip_SWM_MovablePinAssign(SWM_SPI1_MOSI_IO, 14);//选择P0.14作为SPI MOSI1
#if defined(BOARD_LPC812MAX)
Chip_SWM_MovablePinAssign(SWM_SPI1_MISO_IO, 15);//选择P0.15作为SPI MISO1
#else
Chip_SWM_MovablePinAssign(SWM_SPI1_MISO_IO, 6);//选择P0.6作为SPI MISO1
#endif
Chip_SWM_MovablePinAssign(SWM_SPI1_SSEL_IO, 13);//选择P0.13作为SPI SSEL1
/* Disable the clock to the Switch Matrix to save power */
Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);//关闭开关矩阵时钟
#elif defined(BOARD_NXP_LPCXPRESSO_824)
Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);//打开开关矩阵时钟
Chip_SWM_MovablePinAssign(SWM_SPI1_SSEL0_IO, 15);//选择P0.15作为SPI SSEL1
Chip_SWM_MovablePinAssign(SWM_SPI1_SCK_IO, 24);//选择P0.24作为SPI SCK1
Chip_SWM_MovablePinAssign(SWM_SPI1_MISO_IO, 25);//选择P0.25作为SPI MISO1
Chip_SWM_MovablePinAssign(SWM_SPI1_MOSI_IO, 26);//选择P0.26作为SPI MOSI1
Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);//关闭开关矩阵时钟
#else
/* Configure your own SPI pin muxing here if needed */
#warning "No SPI pin muxing defined"
#endif
}
int main(void)
{
SystemCoreClockUpdate();
Board_Init();
/* SPI initialization */
Init_SPI_PinMux();//初始化SPI引脚
/*
ConfigStruct.Mode = SPI_MODE_TEST;
ConfigStruct.ClkDiv = Chip_SPI_CalClkRateDivider(LPC_SPI, 100000);
ConfigStruct.ClockMode = SPI_CLOCK_CPHA0_CPOL0;
ConfigStruct.DataOrder = SPI_DATA_MSB_FIRST;
ConfigStruct.SSELPol = SPI_SSEL_ACTIVE_LO;
*/
Chip_SPI_Init(LPC_SPI);//初始化SPI
Chip_SPI_ConfigureSPI(LPC_SPI, SPI_MODE_TEST | /* Enable master/Slave mode *///使能SPI主/从模式
SPI_CLOCK_CPHA0_CPOL0 | /* Set Clock polarity to 0 *///SPI极性为0
SPI_CFG_MSB_FIRST_EN |/* Enable MSB first option *///SPI先发送高字节
SPI_CFG_SPOL_LO); /* Chipselect is active low *///SPI片选脚为低
DelayConfigStruct.FrameDelay = 0;
DelayConfigStruct.PostDelay = 0;
DelayConfigStruct.PreDelay = 0;
DelayConfigStruct.TransferDelay = 0;
Chip_SPI_DelayConfig(LPC_SPI, &DelayConfigStruct);//SPI延时设置
#if INTERRUPT_MODE
/* Setting SPI interrupt */
NVIC_EnableIRQ(SPI_IRQ);//使能SPI中断
#endif
Chip_SPI_Enable(LPC_SPI);//使能SPI
#if LOOPBACK_TEST
Chip_SPI_EnableLoopBack(LPC_SPI);//SPI回调使能
#endif
bufferInit();
XfSetup.Length = BUFFER_SIZE;
XfSetup.pTx = TxBuf;
XfSetup.RxCnt = XfSetup.TxCnt = 0;
XfSetup.DataSize = 8;
#if (RW_TEST || LOOPBACK_TEST)
XfSetup.pRx = RxBuf;
#else
XfSetup.pRx = NULL;
#endif
#if POLLING_MODE
#if (RW_TEST || LOOPBACK_TEST)
Chip_SPI_RWFrames_Blocking(LPC_SPI, &XfSetup);
#else
Chip_SPI_WriteFrames_Blocking(LPC_SPI, &XfSetup);
#endif
#elif INTERRUPT_MODE
Chip_SPI_Int_RWFrames(LPC_SPI, &XfSetup);
Chip_SPI_Int_Cmd(LPC_SPI, SPI_INTENSET_TXDYEN | SPI_INTENSET_RXDYEN
| SPI_INTENSET_RXOVEN | SPI_INTENSET_TXUREN, ENABLE);
while (!isXferCompleted) {}
while (!(Chip_SPI_GetStatus(LPC_SPI) & SPI_STAT_SSD)) {}/* Make sure the last frame sent completely */
#endif /*INTERRUPT_MODE*/
#if (RW_TEST || LOOPBACK_TEST)
if (bufferVerify()) {
Board_LED_Set(1, true);
}
else
#endif /*(RW_TEST || LOOPBACK_TEST)*/
{
Board_LED_Set(0, true);
}
#if LOOPBACK_TEST
Chip_SPI_DisableLoopBack(LPC_SPI);
#endif
/* DeInitialize SPI peripheral */
Chip_SPI_DeInit(LPC_SPI);
while (1) {}
}
|
|