|
使用LPC1114 SPI使用W5200以太网模块,SPI一直失败,不知道什么原因。硬件没有问题,1114 SPI0主SPI1从,发送数据测试没有问题。
我的SPI初始化程序:
void SPI0Master_Init(void)
{
uint8_t i,Clear=Clear;
LPC_SYSCON->PRESETCTRL |= 0x01; /* 禁止SPI0复位 */
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 11); /* 打开SPI0外设 */
LPC_IOCON->SCK_LOC = 0x02; /* P0.6配置为SCK */
LPC_SYSCON->SSP0CLKDIV = 0x04; //48M/4=12Mhz
LPC_SSP0->CR0 = (0x01 << 8) | /* SCR 设置SPI时钟分频 */
(0x00 << 7) | /* CPHA 时钟输出相位,0数据在SCK 的第一个时钟沿采样 */
/* 仅SPI模式有效 */
(0x00 << 6) | /* CPOL 时钟输出极性,0 空闲时为低电平 */
/* 仅SPI模式有效 */
(0x00 << 4) | /* FRF 帧格式 00=SPI,01=SSI, */
/* 10=Microwire,11=保留 */
(0x07 << 0); /* DSS 数据长度,0000-0010=保留,*/
/* 0011=4位,0111=8位,1111=16位 */
LPC_SSP0->CR1 = (0x00 << 3) | /* SOD 从机输出禁能,1=禁止 */
(0x00 << 2) | /* MS 主从选择,0=主机,1=从机 */
(0x01 << 1) | /* SSE SSP使能 */
(0x00 << 0); /* LBM 正常模式 */
LPC_SSP0->CPSR = 2; /* PCLK分频值 PCLK/(CPSR×[SCR+1]) */
LPC_SSP0->ICR = 0x03; /* 中断清除寄存器 */
//清空RxFIFO,LPC1114收发均有8帧FIFO,每帧可放置4~16位数据
for ( i = 0; i < 8; i++ )
{
Clear = LPC_SSP0->DR; /* clear the RxFIFO */
}
}
读写程序,
uint8_t SPI0_SendData(uint8_t data)
{
LPC_SSP0->DR = data;
while ((LPC_SSP0->SR & 0x01) == 0); /* 等待TFE置位,即发送FIFO空 */
return(LPC_SSP0->DR);
}
uint8_t SPI0_RcvData (void)
{
LPC_SSP0->DR = 0xFF; /* 发送该数据用以产生时钟 */
while ((LPC_SSP0->SR & 0x01) == 0); /* 等待数据发送完毕 */
/*
* 判断当前是否空闲(是否处于TX Or RX)
*/
while( LPC_SSP0->SR & (1 << 4));
/*
* 判断是否已接收到数据,必须判断是否接收完成,否则
* 新的TX发送再次写入LPC_SSP0->DR寄存器
*/
while( LPC_SSP0->SR & (1 << 2) == 0x00);
return (LPC_SSP0->DR); /* 返回接收到的数据 */
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|