微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > lpc2103 spi与ssp通讯问题

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);
}

while((SPI_SPSR&0x80)==0); //卡在这边
接收数据之前要对p07_ssel0进行设置

参考一下这个程序

  1. 主要用于通过单片机的SPI口读写U盘上的文件。

  2. //============================================================================================================
  3. //
  4. //
  5. // 本单元的功能描述:
  6. //
  7. //   实现 通过UART1 传输数据的功能。
  8. //
  9. //
  10. // 输出函数列表:
  11. //
  12. //   UART1_Init  初始化
  13. //   UART1_Send  发送数据
  14. //===========================================================================================================
  15. // 日期 | 动作 |    单位        | 描述   |联系方式
  16. //===========================================================================================================
  17. //2008-07-28| 创建  |  西安达泰电子   | 创建文件  |029-85272421  http://www.dataie.com
  18. //============================================================================================================

  19. //============================================================================================================
  20. //  引入头文件
  21. //============================================================================================================
  22. //#include <LPC23xx.h>                        /* LPC23xx definitions */

  23. #include "Config.h"
  24. #include "IRQ_Unit.h"
  25. #include "SPI_unit.h"

  26. //============================================================================================================
  27. //定义一些常量
  28. BYTE* vSPI_RD_pData;
  29. WORD vSPI_ReadLength;
  30. WORD vSPI_ReadCounter;
  31. DWORD vSPI_FirstData;
  32. //============================================================================================================



  33. //============================================================================================================
  34. //************************************************************************************************************
  35. //*
  36. //*
  37. //*   开始定义 处理UART中断、实施数据传输的 函数。
  38. //*
  39. //*
  40. //************************************************************************************************************
  41. //============================================================================================================
  42. //函数名:  SPI_Handler
  43. //
  44. //调用关系: 被 硬件中断 调用。
  45. //
  46. //功能描述: SPI1的中断处理程序。
  47. //
  48. //入口参数: 无。
  49. //
  50. //返回值:  无。
  51. //============================================================================================================
  52. void SPI_Handler (void) __irq
  53. {
  54. WORD IntCond;
  55. volatile BYTE Dummy;

  56. IntCond = SSPMIS;
  57. if ( IntCond & SSPMIS_RORMIS ) /* Receive overrun interrupt */
  58. {
  59.   SSPICR = SSPICR_RORIC;  /* clear interrupt */
  60. }
  61. if ( IntCond & SSPMIS_RTMIS ) /* Receive timeout interrupt */
  62. {
  63.   SSPICR = SSPICR_RTIC;  /* clear interrupt */
  64. }

  65.     VICVectAddr = 0;  // Acknowledge Interrupt
  66. }
  67. //============================================================================================================
  68. //************************************************************************************************************
  69. //*
  70. //*
  71. //*   开始定义 本单元的外部接口函数 函数。
  72. //*
  73. //*
  74. //************************************************************************************************************
  75. //============================================================================================================
  76. //函数名:  SPI_Init
  77. //
  78. //调用关系: 被 外部函数 函数调用。
  79. //
  80. //功能描述: SPI1的初始化程序。
  81. //
  82. //入口参数: 无
  83. //
  84. //返回值:  无。
  85. //============================================================================================================
  86. BOOL SPI_Init( void )
  87. {

  88. PINSEL0 |= 0x20000000;       /* SCK1 */
  89. PINSEL1 |= 0x00000540;       /* SSEL1,MOSI1,MOSI1 */

  90. vSPI_ReadCounter = 0;

  91. // enable clock to SSP1 for security reason. By default, it's enabled already
  92. PCONP |= (1 << 10);

  93. //Set DSS data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 0, and SCR is 15
  94. SSPCR0 = 0x0107;

  95. // SSPCPSR clock prescale register, minimum divisor is 0x02 in master mode
  96. SSPCPSR = 0x4;

  97. //IRQ_SetInt( cIRQ_SPI1, 1, (DWORD)SPI_Handler );

  98. // Device select as master, SSP Enabled
  99. SSPCR1 = SSPCR1_SSE;
  100. //* Set SSPINMS registers to enable interrupts */
  101. //* enable all error related interrupts */
  102. SSPIMSC = 0;//SSPIMSC_RORIM | SSPIMSC_RTIM;

  103. return TRUE;
  104. }
  105. //============================================================================================================
  106. //函数名:  SPI_Send
  107. //
  108. //调用关系: 被 外部函数 函数调用。
  109. //
  110. //功能描述: 设置发送数据缓冲区的指针,然后,填写第一次的THR,以后的数据都在中断服务程序中被填写到THR、发送。
  111. //
  112. //入口参数: pBufStart 发送缓冲区的起始位置。
  113. //    DataLength 需要发送的数据长度。
  114. //
  115. //返回值:  无。
  116. //============================================================================================================
  117. BOOL SPI_Send(void* pBufStart, DWORD DataLength)
  118. {
  119. BYTE* pData;

  120. pData = pBufStart;
  121. while (DataLength)
  122. {
  123.   if (SSPSR & SSPSR_TNF)
  124.   {
  125.    SSPDR = *pData;
  126.    pData++;
  127.    DataLength--;
  128.   }
  129. }
  130. return TRUE;
  131. }
  132. //============================================================================================================
  133. //函数名:  SPI_CanSendNextPacket
  134. //
  135. //调用关系: 被 外部函数 函数调用。
  136. //
  137. //功能描述: 查询是否可以发送下一个数据包。
  138. //
  139. //入口参数: 无
  140. //
  141. //返回值:  如果写指针等于发送数据传冲区结束位置,则返回真;否则返回假。
  142. //============================================================================================================
  143. BOOL SPI_CanSendNextPacket(void)
  144. {
  145. return TRUE;
  146. }
  147. //============================================================================================================
  148. //函数名:  SPI_StartRead
  149. //
  150. //调用关系: 被 外部函数 函数调用。
  151. //
  152. //功能描述: 启动读数据过程。
  153. //
  154. //入口参数: pBufStart 发送缓冲区的起始位置。
  155. //    DataLength 需要接收的数据长度。
  156. //
  157. //返回值:  无。
  158. //============================================================================================================
  159. void SPI_StartRead(void* pBufStart, DWORD DataLength, DWORD FirstData)
  160. {
  161. vSPI_RD_pData = pBufStart;
  162. vSPI_ReadLength = DataLength;
  163. vSPI_ReadCounter = 0;
  164. vSPI_FirstData = FirstData;

  165. while (SSPSR & SSPSR_RNE)
  166. {
  167.   *vSPI_RD_pData = SSPDR;
  168. }
  169. }
  170. //============================================================================================================
  171. //函数名:  SPI_GetReadCounter
  172. //
  173. //调用关系: 被 外部函数 函数调用。
  174. //
  175. //功能描述: 查询读了多少个数据。
  176. //
  177. //入口参数: 无
  178. //
  179. //返回值:  读了多少个数据。
  180. //============================================================================================================
  181. DWORD SPI_GetReadCounter(void)
  182. {
  183. DWORD i;

  184. for (i=0; i<4; i++)
  185. {
  186.   SSPDR = 0xFFFF;
  187. }

  188. while ((SSPSR & SSPSR_RNE) && (vSPI_ReadCounter < vSPI_ReadLength))
  189. {
  190.   *vSPI_RD_pData = SSPDR;
  191.   if ((vSPI_ReadCounter == 0) && (*vSPI_RD_pData != vSPI_FirstData))
  192.   {
  193.    if (*vSPI_RD_pData != 0x34)
  194.    {
  195.     *vSPI_RD_pData = vSPI_FirstData;
  196.    }
  197.    continue;
  198.   }
  199.   vSPI_ReadCounter++;
  200.   vSPI_RD_pData++;
  201. }
  202. return vSPI_ReadCounter;
  203. }
  204. //============================================================================================================
  205. //函数名:  SPI_CancelRead
  206. //
  207. //调用关系: 被 外部函数 函数调用。
  208. //
  209. //功能描述: 终止读数据过程。
  210. //
  211. //入口参数: 无
  212. //
  213. //返回值:  无。
  214. //============================================================================================================
  215. void SPI_CancelRead(void)
  216. {
  217. vSPI_ReadCounter = 0;
  218. vSPI_ReadLength  = 0;
  219. }
  220. //============================================================================================================




  221. //============================================================================================================
  222. //
  223. //   End of File
  224. //
  225. //================================================

复制代码

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top