lpc2103 spi与ssp通讯问题
时间:10-02
整理:3721RD
点击:
ssp做主机,spi从机,程序卡在了while((SPI_SPSR&0x80)==0);这边,spi没有收到数据
void ssp_Init()
{
p019_miso1;
p020_mosi1;
p014_sck1;
p021_ssel1;
IO0SET=IO0SET|p011;
SSPCR0=0x07<<0|
0x00<<4|
0x00<<6| // 低电平有效
0x00<<7| // 第一个时钟沿采样
0x01<<8;
SSPCR1=0<<0|
1<<1|
0<<2|
0<<3;
SSPCPSR=0x52;
SSPIMSC=0x02;
SSPICR=0x03;
}
void spi_Init()
{
p06_mosi0;
p05_miso0;
p04_sck0;
p07_ssel0;
SPI_SPCR=0<<2| //每次传输8位
0<<3| // 第一个时钟沿采样
0<<4| //高电平有效
0<<5| //设置为从机
0<<6|
0<<7;
}
uint8 ssp_sendbyte(uint8 data)
{
SSPDR=data;
while((SSPSR&0x01)==0);
uart0_sendbyte(0xff);
return(SSPDR);
}
uint8 spi_rcvbyte()
{
while((SPI_SPSR&0x80)==0); //卡在这边
return(SPI_SPDR);
}
void ssp_Init()
{
p019_miso1;
p020_mosi1;
p014_sck1;
p021_ssel1;
IO0SET=IO0SET|p011;
SSPCR0=0x07<<0|
0x00<<4|
0x00<<6| // 低电平有效
0x00<<7| // 第一个时钟沿采样
0x01<<8;
SSPCR1=0<<0|
1<<1|
0<<2|
0<<3;
SSPCPSR=0x52;
SSPIMSC=0x02;
SSPICR=0x03;
}
void spi_Init()
{
p06_mosi0;
p05_miso0;
p04_sck0;
p07_ssel0;
SPI_SPCR=0<<2| //每次传输8位
0<<3| // 第一个时钟沿采样
0<<4| //高电平有效
0<<5| //设置为从机
0<<6|
0<<7;
}
uint8 ssp_sendbyte(uint8 data)
{
SSPDR=data;
while((SSPSR&0x01)==0);
uart0_sendbyte(0xff);
return(SSPDR);
}
uint8 spi_rcvbyte()
{
while((SPI_SPSR&0x80)==0); //卡在这边
return(SPI_SPDR);
}
while((SPI_SPSR&0x80)==0); //卡在这边
接收数据之前要对p07_ssel0进行设置
参考一下这个程序
- 主要用于通过单片机的SPI口读写U盘上的文件。
- //============================================================================================================
- //
- //
- // 本单元的功能描述:
- //
- // 实现 通过UART1 传输数据的功能。
- //
- //
- // 输出函数列表:
- //
- // UART1_Init 初始化
- // UART1_Send 发送数据
- //===========================================================================================================
- // 日期 | 动作 | 单位 | 描述 |联系方式
- //===========================================================================================================
- //2008-07-28| 创建 | 西安达泰电子 | 创建文件 |029-85272421 http://www.dataie.com
- //============================================================================================================
- //============================================================================================================
- // 引入头文件
- //============================================================================================================
- //#include <LPC23xx.h> /* LPC23xx definitions */
- #include "Config.h"
- #include "IRQ_Unit.h"
- #include "SPI_unit.h"
- //============================================================================================================
- //定义一些常量
- BYTE* vSPI_RD_pData;
- WORD vSPI_ReadLength;
- WORD vSPI_ReadCounter;
- DWORD vSPI_FirstData;
- //============================================================================================================
-
- //============================================================================================================
- //************************************************************************************************************
- //*
- //*
- //* 开始定义 处理UART中断、实施数据传输的 函数。
- //*
- //*
- //************************************************************************************************************
- //============================================================================================================
- //函数名: SPI_Handler
- //
- //调用关系: 被 硬件中断 调用。
- //
- //功能描述: SPI1的中断处理程序。
- //
- //入口参数: 无。
- //
- //返回值: 无。
- //============================================================================================================
- void SPI_Handler (void) __irq
- {
- WORD IntCond;
- volatile BYTE Dummy;
- IntCond = SSPMIS;
- if ( IntCond & SSPMIS_RORMIS ) /* Receive overrun interrupt */
- {
- SSPICR = SSPICR_RORIC; /* clear interrupt */
- }
- if ( IntCond & SSPMIS_RTMIS ) /* Receive timeout interrupt */
- {
- SSPICR = SSPICR_RTIC; /* clear interrupt */
- }
- VICVectAddr = 0; // Acknowledge Interrupt
- }
- //============================================================================================================
- //************************************************************************************************************
- //*
- //*
- //* 开始定义 本单元的外部接口函数 函数。
- //*
- //*
- //************************************************************************************************************
- //============================================================================================================
- //函数名: SPI_Init
- //
- //调用关系: 被 外部函数 函数调用。
- //
- //功能描述: SPI1的初始化程序。
- //
- //入口参数: 无
- //
- //返回值: 无。
- //============================================================================================================
- BOOL SPI_Init( void )
- {
- PINSEL0 |= 0x20000000; /* SCK1 */
- PINSEL1 |= 0x00000540; /* SSEL1,MOSI1,MOSI1 */
- vSPI_ReadCounter = 0;
-
- // enable clock to SSP1 for security reason. By default, it's enabled already
- PCONP |= (1 << 10);
- //Set DSS data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 0, and SCR is 15
- SSPCR0 = 0x0107;
- // SSPCPSR clock prescale register, minimum divisor is 0x02 in master mode
- SSPCPSR = 0x4;
- //IRQ_SetInt( cIRQ_SPI1, 1, (DWORD)SPI_Handler );
-
- // Device select as master, SSP Enabled
- SSPCR1 = SSPCR1_SSE;
- //* Set SSPINMS registers to enable interrupts */
- //* enable all error related interrupts */
- SSPIMSC = 0;//SSPIMSC_RORIM | SSPIMSC_RTIM;
- return TRUE;
- }
- //============================================================================================================
- //函数名: SPI_Send
- //
- //调用关系: 被 外部函数 函数调用。
- //
- //功能描述: 设置发送数据缓冲区的指针,然后,填写第一次的THR,以后的数据都在中断服务程序中被填写到THR、发送。
- //
- //入口参数: pBufStart 发送缓冲区的起始位置。
- // DataLength 需要发送的数据长度。
- //
- //返回值: 无。
- //============================================================================================================
- BOOL SPI_Send(void* pBufStart, DWORD DataLength)
- {
- BYTE* pData;
- pData = pBufStart;
- while (DataLength)
- {
- if (SSPSR & SSPSR_TNF)
- {
- SSPDR = *pData;
- pData++;
- DataLength--;
- }
- }
- return TRUE;
- }
- //============================================================================================================
- //函数名: SPI_CanSendNextPacket
- //
- //调用关系: 被 外部函数 函数调用。
- //
- //功能描述: 查询是否可以发送下一个数据包。
- //
- //入口参数: 无
- //
- //返回值: 如果写指针等于发送数据传冲区结束位置,则返回真;否则返回假。
- //============================================================================================================
- BOOL SPI_CanSendNextPacket(void)
- {
- return TRUE;
- }
- //============================================================================================================
- //函数名: SPI_StartRead
- //
- //调用关系: 被 外部函数 函数调用。
- //
- //功能描述: 启动读数据过程。
- //
- //入口参数: pBufStart 发送缓冲区的起始位置。
- // DataLength 需要接收的数据长度。
- //
- //返回值: 无。
- //============================================================================================================
- void SPI_StartRead(void* pBufStart, DWORD DataLength, DWORD FirstData)
- {
- vSPI_RD_pData = pBufStart;
- vSPI_ReadLength = DataLength;
- vSPI_ReadCounter = 0;
- vSPI_FirstData = FirstData;
-
- while (SSPSR & SSPSR_RNE)
- {
- *vSPI_RD_pData = SSPDR;
- }
- }
- //============================================================================================================
- //函数名: SPI_GetReadCounter
- //
- //调用关系: 被 外部函数 函数调用。
- //
- //功能描述: 查询读了多少个数据。
- //
- //入口参数: 无
- //
- //返回值: 读了多少个数据。
- //============================================================================================================
- DWORD SPI_GetReadCounter(void)
- {
- DWORD i;
- for (i=0; i<4; i++)
- {
- SSPDR = 0xFFFF;
- }
- while ((SSPSR & SSPSR_RNE) && (vSPI_ReadCounter < vSPI_ReadLength))
- {
- *vSPI_RD_pData = SSPDR;
- if ((vSPI_ReadCounter == 0) && (*vSPI_RD_pData != vSPI_FirstData))
- {
- if (*vSPI_RD_pData != 0x34)
- {
- *vSPI_RD_pData = vSPI_FirstData;
- }
- continue;
- }
- vSPI_ReadCounter++;
- vSPI_RD_pData++;
- }
- return vSPI_ReadCounter;
- }
- //============================================================================================================
- //函数名: SPI_CancelRead
- //
- //调用关系: 被 外部函数 函数调用。
- //
- //功能描述: 终止读数据过程。
- //
- //入口参数: 无
- //
- //返回值: 无。
- //============================================================================================================
- void SPI_CancelRead(void)
- {
- vSPI_ReadCounter = 0;
- vSPI_ReadLength = 0;
- }
- //============================================================================================================
-
- //============================================================================================================
- //
- // End of File
- //
- //================================================