搜索
bottom↓
回复: 9

LPC1766 SSP1配置成SPI,读写失败?大家帮忙看看

[复制链接]

出0入0汤圆

发表于 2010-5-4 10:49:42 | 显示全部楼层 |阅读模式
LPC1766 SSP1配置成SPI 操作fm1702sl 读写失败  ,看看我的配置有问题吗?
void SPI1Init(void)
{
        PINSEL0 |= 0x000A8000; // set p0.9 as MOSI1 p0.8  as MISO1 p0.7 as sck1  p0.6 nss as GPIO
        PINSEL1 |= 0x00000000; //
        FIO0DIR |= 0x00800040; // set p0.6 p0.23 output

        SSP1CPSR = 0xF0;      //设置SPI时钟分频  
    SSP1CR0 = (0x01 << 8) |              // SCR  设置SPI时钟分频          SSP时钟=Fpclk/(CSPDVR*(SCR+1))  = 28800000/(0xf0*2)
              (0x00 << 7) |              // CPHA 时钟输出相位,仅SPI模式有效     
              (0x00 << 6) |              // CPOL 时钟输出极性,仅SPI模式有效   
              (0x00 << 4) |              // FRF  帧格式 00=SPI,01=SSI,10=Microwire,11=保留   
              (0x07 << 0);               // DSS  数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位
        SSP1IMSC = 0x00;          //禁止中断
    SSP1CR1 = (0x00 << 3) |              // SOD  从机输出禁能,1=禁止,0=允许   
              (0x00 << 2) |              // MS   主从选择,0=主机,1=从机   
              (0x01 << 1) |              // SSE  SSP使能,1=允许SSP与其它设备通信   
              (0x00 << 0);               // LBM  回写模式
        SSP1ICR         = 0x00;       
}
void SPI1Send( BYTE buf)
{
  BYTE Dummy;
  
  SSP1DR = buf;
  while(0==(SSP1SR&0x01));
  Dummy = SSP1DR;               
  Dummy = Dummy;               

  return;
}

BYTE SPI1ReceiveByte( void )
{
  BYTE data;
  SSP1DR = 0xFF;
  while ( !(SSP1SR & 0x04));
  data = SSP1DR;
  return ( data );
}

出0入0汤圆

发表于 2010-5-7 14:41:40 | 显示全部楼层
帮顶,最近也用到了SSP

出0入0汤圆

发表于 2010-5-7 14:52:06 | 显示全部楼层
我猜你应该是用p0.6代替 SSEL1,但void SPI1Send( BYTE buf)  里没有对p0.6操作

出0入0汤圆

 楼主| 发表于 2010-5-7 16:22:57 | 显示全部楼层
谢谢,已经解决了! SSEL1我在另外程序里操作的!解决后的读写程序如下。
void SPI1Send( BYTE buf)
{
  BYTE Dummy;
  // BSY  (1<<4)   
  // RNE  (1<<2)
  // TNF  (1<<1)
  while((SSP1SR & ((1<<1)|(1<<4))) != (1<<1) );
  SSP1DR = buf;
  while((SSP1SR & ((1<<4)|(1<<2))) != (1<<2) );
  Dummy = SSP1DR;                /* Flush the RxFIFO */
  Dummy = Dummy;                /* 防止编译器报错   */

  return;
}
BYTE SPI1ReceiveByte( void )
{
  BYTE data;

  /* wrtie dummy byte out to generate clock, then read data from MISO */
  SSP1DR = 0xFF;
  /* Wait for transfer complete */
  // BSY  (1<<4)   
  // RNE  (1<<2)
  while ((SSP1SR & ((1<<4)|(1<<2))) != (1<<2));

  data = SSP1DR;
  return ( data );
}

出0入0汤圆

发表于 2010-5-7 18:41:30 | 显示全部楼层
请教一下,发送和接收函数都是向SSP1DR写数据,为什么在发送函数里,先判断了transmit fifo不满才发送,而接收函数发dummy却不判断?假如发dummy时,transmit fifo是满的话,会写入不了,导致时钟不动,从而接收不到。

但整体考虑,发送函数是在接收完返回的数据后函数才结束,才能调用下一个发送函数,这样的话,transmit fifo里面最多只有一个数据,永远不会满。

所以我觉得去掉while((SSP1SR & ((1<<1)|(1<<4))) != (1<<1) );这句,是不是可以?

出0入0汤圆

发表于 2011-10-19 15:15:27 | 显示全部楼层
顶,正在学习SSP

出235入8汤圆

发表于 2011-10-20 14:29:04 | 显示全部楼层
请教一下,发送和接收函数都是向SSP1DR写数据,为什么在发送函数里,先判断了transmit fifo不满才发送,而接收函数发dummy却不判断?

只做发送动作,没有接收。
SSP是可以同时接收与发送的,在发送的时候也在接收数据,所以要把接收的数据扔掉,这是我的理解!
while((SSP1SR & ((1<<4)|(1<<2))) != (1<<2) );
  Dummy = SSP1DR;         /* Flush the RxFIFO */
  Dummy = Dummy;         /* 防止编译器报错   */

出0入0汤圆

发表于 2012-1-15 17:50:05 | 显示全部楼层
点击的人挺多,但回答的人很少,希望大家都积极一点。我再看看技术资料。

出0入8汤圆

发表于 2013-6-25 16:09:23 | 显示全部楼层
问下  不接从接的情况下  通过 recv函数接收spi数据  接收到的是不是应该是0?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-11 17:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表