嵌入式||SPI程序设计(2)

一、实验目的:

  1. 掌握编译工具keil5和模拟器proteus的使用。
  2. 掌握LPC2138SPI模块功能,能够使用SPI传输数据。

二、实验设备:预装了keil及proteus的PC机。

三、实验内容

LPC2138具有硬件SPI接口,它是一个同步、全双工串行接口,在数据传输过程中,主机总是向从机发送一字节数据,同时从机也向主机发送一字节数据,通过设置相关的SPI模式寄存器,实现功能。 

四、实验步骤:

  1. 基础任务:使用keil5编辑程序,生成hex文件,打开DSN文件,把hex文件加入到LPC2138中,观察LED数据显示情况。
  2. 扩展任务:在Demo代码基础上,修改程序使得输出顺序为你的学号,例如你的学号为20210001,则依次显示“2,0,2,1,……,1”。

五、实验要求:

根据实验任务要求,编写源程序。

上机调试程序。完成实验报告

六、实验源程序:

#include  "config.h"
#define   HC595_CS    0x00000100           
uint8 rcv_data;
void DelayNS(uint32 dly)
{  uint32  i;
   for (;dly>0;dly--)
      for(i=0;i<50000;i++);
}

void MSpiIni(void)
{ S0PCCR=0x52;          
  S0PCR=0x30;            
½,MSTR=1,CPOL=1,CPHA=0,LSBF=0
}
uint8 MSendData(uint8 data)
{ IO0CLR=HC595_CS;                             
  S0PDR=data;
  while(0==(S0PSR&0x80));                 
IO0SET=HC595_CS;
  return(S0PDR);
}
  uint8 const DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
                            0x88,0x83,0xC6,0xA1,0x86,0x8E};

int main(void)
{ 
  uint8 i;  
  
  PINSEL0=0x00005500;                 
  PINSEL1=0x00000000;
  
  IO0DIR=HC595_CS; 
  MSpiIni();                         
  while(1)
  { for (i=0;i<16;i++) 
{rcv_data=MSendData(DISP_TAB[i]);  
      DelayNS(50);                     
    }
  }
  
}

观察LED数据:依次输出0-9,A-F:

//拓展任务
/*******************************************************************************
*File: Main.c
*功能: LED数码管显示0-F字符,同时控制4个LED显示对应的十六进制
*******************************************************************************/
#include  "config.h"
#define   HC595_CS    0x00000100            /*P0.8口为74HC595的片选*/
uint8 rcv_data;
/*******************************************************************************
*名称: DelayNS()
*功能: 长软件延时
*******************************************************************************/
void DelayNS(uint32 dly)
{  uint32  i;
   for (;dly>0;dly--)
      for(i=0;i<50000;i++);
}
/*******************************************************************************
*名称: MSpiIni()
*功能: 初始化SPI接口,设置为主机
*******************************************************************************/
void MSpiIni(void)
{ S0PCCR=0x52;           //设置SPI时钟分频
  S0PCR=0x30;            //设置SPI接口模式,MSTR=1,CPOL=1,CPHA=0,LSBF=0
}
/*******************************************************************************
*名称: MSendData()
*功能: 向SPI总线发送数据
*******************************************************************************/
uint8 MSendData(uint8 data)
{ IO0CLR=HC595_CS;                             //片选
  S0PDR=data;
  while(0==(S0PSR&0x80));                  //等待SPIF置位,即等待数据发送完毕
  IO0SET=HC595_CS;
  return(S0PDR);
}
/*此表为0~F的字模*/
 /* uint8 const DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
                            0x88,0x83,0xC6,0xA1,0x86,0x8E}; */
	uint8 const DISP_TAB[11]={0x99,0xA4,0xF9,0xC0,0x90,0xB0,0xF9,0xC0,0xA4,0xA4,0x82};
/*******************************************************************************
*名称: main()
*功能: 使用硬件SPI接口输出0~F的数据,控制LED显示
*******************************************************************************/

int main(void)
{ 
  uint8 i;  
  
  PINSEL0=0x00005500;                 //设置SPI引脚连接
  PINSEL1=0x00000000;
  
  IO0DIR=HC595_CS; 
  MSpiIni();                         //初始化SPI接口
  while(1)
  { for (i=0;i<11;i++) 
    {rcv_data=MSendData(DISP_TAB[i]);   //发送显示数据
      DelayNS(50);                     //延时
    }
  }
  
}

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值