25899|78

2641

帖子

0

TA的资源

五彩晶圆(中级)

楼主
 

【MP430共享】冒死分享公司内部源码库(SPI读铁电,RFID,单总线18B20,I2C读时钟等) [复制链接]

冒死分享公司项目外设驱动代码(SPI读取铁电,RFID驱动,单总线18B20,I2C读SD2000时钟等),绝对的实用,做产品必备,进来的请回帖支持一下

 

第一个读取铁电的代码:

//对铁电的操作不采用中断的方式,而是在需要对数据进行存储或读取时,采用查询中断标志位。

/***************************************************
*函数名称:FM_init
*功能描述:对铁电进行初始化,包括对于之接口的单片机SPI口的初始化
*入口参数:无
*出口参数:无
***************************************************/
void FM_init(void)
{
  UCB2CTL1|=UCSWRST;//先对此位置1
  UCB2CTL0=UCCKPH+UCMSB+UCMST+UCSYNC;//模式3,MSB first,8-bit data,Master mode,3-pin SPI,Synchronous mode
  UCB2CTL1|=UCSSEL_2;//SMCLK作为SPI的时钟
  UCB2BR0=0x01;//SPI采用16M的辅助主时钟
  UCB2BR1=0x00;
  UCB2CTL1&=~UCSWRST;//清零
}
/***************************************************
*函数名称:Fram_Read_char
*功能描述:读取铁电的内容,返回一个8位的数
*入口参数:pab铁电的地址
*出口参数:返回一个char型数据
***************************************************/
unsigned char FM_read_char(unsigned int pab)
{
  unsigned char j,k=0;
  j=(unsigned char)pab;
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x03;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=(unsigned char)(pab>>8);//当数据写入TXBUF后,UCTXIFG标志自动清零;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=j;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=0;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  k=UCB2RXBUF;
  FM_CS_1;     //不选中铁电
  return k;
}
/***************************************************
*函数名称:Fram_Read_int
*功能描述:读取铁电的内容,返回一个16位的数
*入口参数:pab铁电的地址
*出口参数:返回一个int型数据
***************************************************/
unsigned int FM_read_int(unsigned int pab)
{
  unsigned char j;
  unsigned int t;
  j=(unsigned char)pab;
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x03;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=(unsigned char)(pab>>8);//当数据写入TXBUF后,UCTXIFG标志自动清零;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=j;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=0;
  while((UCB2STAT&UCBUSY)==1);//等待发送完成标志的产生
  j=UCB2RXBUF;
  UCB2TXBUF=0;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  t=UCB2RXBUF;
  t<<=8;
  t|=j;
  FM_CS_1;     //不选中铁电
  return t;
}
/***************************************************
*函数名称:FM_write_char
*功能描述:向铁电写入一个8位的数据
*入口参数:pab铁电的地址,date:写入的数据
*出口参数:无
***************************************************/
void FM_write_char(unsigned int pab,unsigned char date)
{
  unsigned char j;
  j=(unsigned char)pab;
 // _DINT();
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x06;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  FM_CS_1;     //不选中铁电
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x02;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  UCB2TXBUF=(unsigned char)(pab>>8);//i;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=j;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=date;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  FM_CS_1;     //不选中铁电
 // _EINT();
}
/***************************************************
*函数名称:FM_write_int
*功能描述:向铁电写入一个16位的数据
*入口参数:pab铁电的地址,date:写入的数据
*出口参数:无
***************************************************/
void FM_write_int(unsigned int pab,unsigned int date)
{
  unsigned char j;
  j=(unsigned char)pab;
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x06;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  FM_CS_1;     //不选中铁电
 
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x02;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  UCB2TXBUF=(unsigned char)(pab>>8);//i;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=j;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  j=(unsigned char)(date>>8);
  UCB2TXBUF=(unsigned char)date;//j;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=j;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  FM_CS_1;     //不选中铁电
}
/***************************************************
*函数名称:tx_write_int
*功能描述:向铁电写入一个8位的数据
*入口参数:pab铁电的地址,date:写入的数据
*出口参数:无
***************************************************/
void tx_write_int(unsigned int pab,unsigned int date)
{
  unsigned char j;
  j=(unsigned char)pab;
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x06;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  FM_CS_1;     //不选中铁电
 
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x02;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  UCB2TXBUF=(unsigned char)(pab>>8);//i;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=j;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  j=(unsigned char)(date>>8);
  UCB2TXBUF=(unsigned char)date;//j;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=j;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  FM_CS_1;     //不选中铁电
}
/***************************************************
*函数名称:FM_write_jg_tou_gs
*功能描述:向铁电写入结构头的个数
*入口参数:无
*出口参数:无
***************************************************/
void FM_write_jg_tou_gs(void)
{
   // _DINT();
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x06;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  FM_CS_1;     //不选中铁电
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x02;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  UCB2TXBUF=0;//i;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=10;//10;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生

  UCB2TXBUF=0x5a;
  while((UCB2IFG&UCTXIFG)==0);   
  UCB2TXBUF=id_jg.gs;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  FM_CS_1;     //不选中铁电
}
/***************************************************
*函数名称:FM_write_bt
*功能描述:向铁电写入表头,
*入口参数:pab:表头的起始地址,djg:第几个表头,0表示第一个
*出口参数:无
***************************************************/
void FM_write_bt(unsigned int pab,unsigned int djg)
{
   unsigned char j;
  j=(unsigned char)pab;
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x06;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  FM_CS_1;     //不选中铁电
 
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x02;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  UCB2TXBUF=(unsigned char)(pab>>8);//i;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=j;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
 
   UCB2TXBUF=id_jg.lbt[djg].year;
   while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生

  UCB2TXBUF=id_jg.lbt[djg].month;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=id_jg.lbt[djg].day;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=id_jg.lbt[djg].hour;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生

  UCB2TXBUF=(unsigned char)id_jg.lbt[djg].hour_id_gs;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=(unsigned char)(id_jg.lbt[djg].hour_id_gs>>8);
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=(unsigned char)id_jg.lbt[djg].hour_td_begin;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=(unsigned char)(id_jg.lbt[djg].hour_td_begin>>8);
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
 
  UCB2TXBUF=(unsigned char)id_jg.lbt[djg].hour_tx_tran_ok_gs;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  UCB2TXBUF=(unsigned char)(id_jg.lbt[djg].hour_tx_tran_ok_gs>>8);
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  FM_CS_1;     //不选中铁电
}
/***************************************************
*函数名称:FM_clr0_32768
*功能描述:清除铁电中的所有数据
*入口参数:无
*出口参数:无
***************************************************/
void FM_clr0_32768(void)
 {
  unsigned int i;
 // _DINT();
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x06;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  FM_CS_1;     //不选中铁电
  //////////////////
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x02;
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  for(i=0;i<32768;i++)
  {
   UCB2TXBUF=0;//(unsigned char)pab;
  while((UCB2IFG&UCTXIFG)==0);//等待发送完成标志的产生
  }
  while((UCB2STAT&UCBUSY)==1);//等待SPI不忙
  FM_CS_1;     //不选中铁电
 }
/***************************************************
*函数名称:FM_read_bt
*功能描述:读取铁电中的相关信息参数
*入口参数:无
*出口参数:无
***************************************************/
void FM_read_bt(void)
{
  unsigned char i,j;//,k=0;
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB0TXBUF=0x03;
  while((UCB2IFG&UCTXIFG)==0); 
  UCB2TXBUF=0;//
  while((UCB2IFG&UCTXIFG)==0);
  UCB2TXBUF=12;
  while((UCB2IFG&UCTXIFG)==0);
  for(i=0;i<24;i++)//macheng连续性的把所有参数全部读取出来
  {   
    UCB2TXBUF=0;
    while((UCB2STAT&UCBUSY)==1);
    id_jg.lbt.year=UCB0RXBUF;
    UCB2TXBUF=0;
    while((UCB2STAT&UCBUSY)==1);
    id_jg.lbt.month=UCB0RXBUF;
    UCB2TXBUF=0;
    while((UCB2STAT&UCBUSY)==1);
    id_jg.lbt.day=UCB0RXBUF;
    UCB2TXBUF=0;
    while((UCB2STAT&UCBUSY)==1);
    id_jg.lbt.hour=UCB0RXBUF;
    UCB2TXBUF=0;
    while((UCB2STAT&UCBUSY)==1);
    j=UCB2RXBUF;
    UCB2TXBUF=0;
    while((UCB2STAT&UCBUSY)==1);
    id_jg.lbt.hour_id_gs=UCB2RXBUF;
    id_jg.lbt.hour_id_gs<<=8;
    id_jg.lbt.hour_id_gs|=j;
    UCB2TXBUF=0;
    while((UCB0STAT&UCBUSY)==1);
    j=UCB2RXBUF;
     UCB2TXBUF=0;
    while((UCB0STAT&UCBUSY)==1);
    id_jg.lbt.hour_td_begin=UCB0RXBUF;
    id_jg.lbt.hour_td_begin<<=8;
    id_jg.lbt.hour_td_begin|=j;
    UCB0TXBUF=0;
    while((UCB0STAT&UCBUSY)==1);
    j=UCB2RXBUF;
    UCB2TXBUF=0;
    while((UCB2STAT&UCBUSY)==1);
    id_jg.lbt.hour_tx_tran_ok_gs=UCB2RXBUF;
    id_jg.lbt.hour_tx_tran_ok_gs<<=8;
    id_jg.lbt.hour_tx_tran_ok_gs|=j;
  }
  FM_CS_1;     //不选中铁电
}
/***************************************************
*函数名称:write_clr10_32768
*功能描述:把铁电中从第十字节开始到32768字节结束的内容清除
*入口参数:无
*出口参数:无
***************************************************/
void write_clr10_32768(void)
{
  unsigned int i;
 // _DINT();
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x06;
  while((UCB2IFG&UCTXIFG)==0);
  FM_CS_1;//不选中铁电    
  //////////////////
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x02;
  while((UCB2STAT&UCBUSY)==1);
  UCB2TXBUF=0;//(unsigned char)(pab>>8);
  while((UCB2IFG&UCTXIFG)==0);

  UCB2TXBUF=10;//(unsigned char)pab;
  while((UCB2STAT&UCBUSY)==1)  WDTCTL=WDTPW+WDTCNTCL+WDTSSEL_1;
  for(i=10;i<32768;i++)
  {
   UCB2TXBUF=0;//(unsigned char)pab;
   while((UCB2IFG&UCTXIFG)==0);
  }
   WDTCTL=WDTPW+WDTCNTCL+WDTSSEL_1;
    while((UCB2STAT&UCBUSY)==1);
  FM_CS_1;     //不选中铁电
}
/***************************************************
*函数名称:read_td_id_hao_fen
*功能描述:读取铁电中此地址下的卡号和对应的分钟数
*入口参数:铁电地址
*出口参数:无
***************************************************/
void read_td_id_hao_fen(unsigned int pab)
{

  unsigned char j;//,k=0;
  j=(unsigned char)pab;
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x03;
  while((UCB2IFG&UCTXIFG)==0); 
  UCB2TXBUF=(unsigned char)(pab>>8);//i;
  while((UCB2IFG&UCTXIFG)==0);
  UCB2TXBUF=j;
  while((UCB2IFG&UCTXIFG)==0);
  UCB2TXBUF=0;
  while((UCB2STAT&UCBUSY)==1);
  rdtd.fen=UCB2RXBUF;
  UCB2TXBUF=0;
  while((UCB2STAT&UCBUSY)==1);
  j=UCB2RXBUF;
  UCB2TXBUF=0;
  while((UCB2STAT&UCBUSY)==1); 
  rdtd.ID_HAO=UCB2RXBUF;
  rdtd.ID_HAO<<=8;
  rdtd.ID_HAO|=j;
  FM_CS_1;     //不选中铁电
}

void tx_read_td_id_hao_fen(unsigned int pab)
{

  unsigned char j;//,k=0;
  j=(unsigned char)pab;
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x03;
  while((UCB2IFG&UCTXIFG)==0); 
  UCB2TXBUF=(unsigned char)(pab>>8);//i;
  while((UCB0IFG&UCTXIFG)==0);
  UCB2TXBUF=j;
  while((UCB2IFG&UCTXIFG)==0);
  UCB2TXBUF=0;
  while((UCB2STAT&UCBUSY)==1);
  txtd.fen=UCB2RXBUF;
  UCB2TXBUF=0;
  while((UCB2STAT&UCBUSY)==1);
  j=UCB2RXBUF;
  UCB2TXBUF=0;
  while((UCB2STAT&UCBUSY)==1); 
  txtd.ID_HAO=UCB2RXBUF;
  txtd.ID_HAO<<=8;
  txtd.ID_HAO|=j;
  FM_CS_1;     //不选中铁电
}
void add_td_id_hao_fen(unsigned int pab)
{
  unsigned char j;
  j=(unsigned char)pab;
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x06;
  while((UCB2STAT&UCBUSY)==1);

  FM_CS_1;//不选中铁电    
  //////////////////
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x02;
  while((UCB2STAT&UCBUSY)==1);

  UCB2TXBUF=(unsigned char)(pab>>8);
  while((UCB2IFG&UCTXIFG)==0);
  UCB2TXBUF=j;
  while((UCB2IFG&UCTXIFG)==0);
  UCB2TXBUF=lstemp_ka_hao_fen;//IDHAO_CHULI.dangqian_fen;//j;
  while((UCB2IFG&UCTXIFG)==0);
  j=(unsigned char)(lstemp_ka_hao>>8);//(temp_id.id_hao[p]>>8);//(IDHAO_CHULI.id_hao>>8);//(date>>8);
  UCB2TXBUF=(unsigned char)lstemp_ka_hao;//temp_id.id_hao[p];//IDHAO_CHULI.id_hao;//date;//j;
  while((UCB2IFG&UCTXIFG)==0);
  UCB2TXBUF=j;
  while((UCB2STAT&UCBUSY)==1);
  FM_CS_1;     //不选中铁电
 
}

void write_td_id_hao_fen(unsigned int pab)//,unsigned int date)
{
 
  unsigned char j;
  j=(unsigned char)pab;
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x06;
   while((UCB2STAT&UCBUSY)==1);

  FM_CS_1;//不选中铁电    
  //////////////////
  FM_CS_0;//选中铁电
  FM_WP_1;//不进行写保护
  UCB2TXBUF=0x02;
  while((UCB2STAT&UCBUSY)==1);

  UCB2TXBUF=(unsigned char)(pab>>8);
  while((UCB2IFG&UCTXIFG)==0);
  UCB2TXBUF=j;
  while((UCB2IFG&UCTXIFG)==0);
   UCB2TXBUF=rdtd.fen;//IDHAO_CHULI.dangqian_fen;//j;
  while((UCB2IFG&UCTXIFG)==0);
  j=(unsigned char)(rdtd.ID_HAO>>8);//(temp_id.id_hao[p]>>8);//(IDHAO_CHULI.id_hao>>8);//(date>>8);
  UCB2TXBUF=(unsigned char)rdtd.ID_HAO;//temp_id.id_hao[p];//IDHAO_CHULI.id_hao;//date;//j;
  while((UCB2IFG&UCTXIFG)==0);
  UCB2TXBUF=j;
  while((UCB2STAT&UCBUSY)==1);
  FM_CS_1;     //不选中铁电
 
}

最新回复

顶顶顶,没看到度RFID的代码啊?  详情 回复 发表于 2023-3-3 17:25

点评

明天到我办公室来一下:Mad:  详情 回复 发表于 2012-6-23 21:36
 
点赞 关注(2)

回复
举报

2641

帖子

0

TA的资源

五彩晶圆(中级)

沙发
 
SPI驱动24L01发送端程序:
#include "msp430x14x.h"
#define uchar unsigned char
#define uint unsigned int
        //POW_UP通过配置子写入
#define CSN  BIT0  //每次SPI前一个下降沿,SPI后上升沿
#define MOSI BIT1
#define MISO BIT2
#define SCK  BIT3
#define CE   BIT4
#define IRQ  BIT5
//SPI Commands     command word
#define R_REGISTER   0x00  //0x00 + Register address
#define W_REGISTER   0x20  //0x20 + Register address
#define R_RX_PAYLOAD 0x61
#define W_TX_PAYLOAD 0xA0
#define FLUSH_TX     0xE1
#define FLUSH_RX     0xE2
#define REUSE_TX_PL  0xE3
#define NOP          0xFF
//Register Definitions
      // name    address  data  what
#define CONFIG    0x00  //0x7e:EN CRC、PWR_UP、TX
#define EN_AA     0x01  //0x00:Disabe Enhanced ShockBurst
#define EN_RXADDR 0x02  //0X01:使能pipe 0
#define SETUP_AW  0x03  //0X03:默认5字节的地址宽度 RX/TX Address width
#define SETUP_RETR 0x04 //0X00: Auto Retransmit disabled  
#define RF_CH      0x05 //0X00: Sets the frequency channel nRF24L01 operates on
#define RF_SETUP   0x06 //0X06:1M、0dBm、no LNA
#define STATUS     0x07 //read and中断服务程序后清标志
#define OBSERVE_TX 0x08 //read only
#define CD         0x09 //用在Enhanced ShockBurst
#define RX_ADDR_P0 0x0A //接收通道0的地址(LSbuf is written first)
#define RX_ADDR_P1 0x0B //0x00:不使用
#define RX_ADDR_P2 0x0C //0x00:不使用
#define RX_ADDR_P3 0x0D //0x00:不使用
#define RX_ADDR_P4 0x0E //0x00:不使用
#define RX_ADDR_P5 0x0F //0x00:不使用
#define TX_ADDR  0x10   //0XE7E7E7E7E7:默认发送通道的地址5字节
#define RX_PW_P0 0x11   //0X03:接收通道0的数据宽度为3字节
#define RX_PW_P1 0x12   //0X00:该接收通道不使用
#define RX_PW_P2 0x13   //0X00:该接收通道不使用
#define RX_PW_P3 0x14   //0X00:该接收通道不使用
#define RX_PW_P4 0x15   //0X00:该接收通道不使用  
#define RX_PW_P5 0x16   //0X00:该接收通道不使用
#define FIFO_STATUS 0x17//read only

uchar Tx_Address[5]={0x09,0x87,0x65,0x43,0x21};//设置发送端的地址
uchar Tx_date=0x10;//要发送的数据

void clk_sys_init();   //MCLK = SMCLK = 4M
void io_nrf_init();    //无线端口初始化(P2)
void nrf24l01_on();    //nrf24l01 POWER ON
void wr_spi_byte(uchar date);
void wr_spi(uchar command_address,uchar config_date);
void tx_nrf_init();
void Set_Rx_Address();  //设置接收通道的地址的地址
void Set_Tx_Address(); //设置发送端的地址
void tx_payload();     //将要发送的数据写入FIFO
void CE_pulse();       //CE 不低于10us 的上升沿,触发数据发送
void Flush_TX_FIFO();       // 清空 FIFO

void delay_us();     //进入函数需8条指令的时间,2 us
void delay_1_5ms();  //1.5ms  
void delay(uint time);
void delay_130us();  //需要 520 * (1/4M)=130us
/************************主程序******************************/
void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  
  clk_sys_init();     //MCLK = SMCLK = 4M
  io_nrf_init();

  nrf24l01_on();    //PWR_UP、TX_DS、IRQ、EN CRC、TX
  delay_1_5ms();    //1.5ms  6000 *(1/4M)= 1.5ms
  tx_nrf_init();    //初始化配置字     
  Set_Tx_Address(); //设置发送端的地址   
   
  while(1)
  {
   tx_payload();     //将要发送的数据写入FIFO   
   CE_pulse();       //CE 不低于10us 的上升沿,触发数据发送   
   delay_130us();  
    Flush_TX_FIFO(); // 清空 FIFO  
    P1OUT ^= BIT4;   //指示灯
    delay(8000);     //距下次发送的时间
  }
}
/****************************初始化程序************************/
void clk_sys_init()
{  
  uint i;
    BCSCTL1 &= ~XT2OFF;
  do
  {
    IFG1 &=~OFIFG;
    for(i=0;i<0xff;i++);
  }
  while(!(IFG1 & OFIFG));
  BCSCTL2 |= SELM1 + SELS;  //MCLK = SMCLK = 4M
}
void io_nrf_init()
{
  P2DIR |= CSN + MOSI + SCK + CE;  //SOMI , IRQ INPUT
  P2OUT=0;
  P2OUT |= CSN;
// P2IES |= IRQ;  //下降沿置标志位
// P2IE |= IRQ;
  P1DIR |= BIT4;  //LED
}
/************************无线模块程序*************************/
void nrf24l01_on()
{
  wr_spi(W_REGISTER + CONFIG,0x3e);/////////1e 中断都不允许
}  
void wr_spi(uchar command_address,uchar config_date)
{
  P2OUT |=CSN;
  P2OUT &=~CSN;
  wr_spi_byte(command_address);
  wr_spi_byte(config_date);
  P2OUT |= CSN;
}
void tx_nrf_init()                  
{
  wr_spi(W_REGISTER + EN_AA,0x00);      //NO ack        
  wr_spi(W_REGISTER + EN_RXADDR,0x01);
  wr_spi(W_REGISTER + SETUP_AW,0x03);
  wr_spi(W_REGISTER + SETUP_RETR,0x00);  
  wr_spi(W_REGISTER + RF_CH,0x00);      //2.4G
  wr_spi(W_REGISTER + RF_SETUP,0x06);
  //wr_spi(W_REGISTER + RX_PW_P0,0x08);
}
void Set_Tx_Address() //设置发送端的地址
{
  uchar i=0;
  P2OUT |= CSN;
  P2OUT &=~ CSN;

  wr_spi_byte(W_REGISTER + TX_ADDR);  
  for(i=0;i<5;i++)
  {
   wr_spi_byte(Tx_Address);  
  }         
  P2OUT |= CSN;
}

void tx_payload()     //将要发送的数据写入FIFO
{
  P2OUT |= CSN;
  P2OUT &=~ CSN;
   wr_spi_byte(W_TX_PAYLOAD);  
   wr_spi_byte(Tx_date);  
  P2OUT |= CSN;
}
void CE_pulse()      //CE 不低于10us 的上升沿,触发数据发送
{
  delay(8);
  P2OUT |= CE;
  delay(8);
  P2OUT &=~ CE;
}

void Flush_TX_FIFO()      // 清空 FIFO
{
  P2OUT |= CSN;
  P2OUT &=~ CSN;
  wr_spi_byte(FLUSH_TX);   
  P2OUT |= CSN;  
}
void wr_spi_byte(uchar date)
{
  uchar bit;
  P2OUT &=~ SCK;  //时钟低电平
  //delay(1);        //建议测试时先加上延时,测试通了再去掉
  for(bit=0;bit<8;bit++)
  {                           //先高位,后低位
    if(date & BIT7)
      P2OUT |= MOSI;
    else
      P2OUT &=~ MOSI;     
      // _NOP();_NOP();_NOP();  //数据建立时间 1us
      P2OUT |= SCK;
   //   delay(2);
    date <<= 1;     //一条指令的时间
      P2OUT &=~ SCK;
   //  delay(2);
  }
  // delay(1);
}

/***************************延时程序**************************/
void delay_us()
{
   ;
}
void delay_1_5ms()
{
  uint i=0,j=0;
  for(i=0;i<30;i++)
    for(j=0;j<38;j++)
      ;
}
void delay(uint time)
{
  uint i;
  for(i=0;i     ;
}
void delay_130us()
{
  uint i=0;
  for(i=0;i<100;i++);
}
/***************************中断程序**************************/
/*#pragma vector=PORT2_VECTOR
__interrupt void p2(void)
{
  P1OUT ^= BIT4;  //LED
  P2IFG =0;
}*/
 
 

回复

2641

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 
SPI驱动24L01接收端程序:
#include "msp430x14x.h"
#define uchar unsigned char
#define uint unsigned int
        //POW_UP通过配置子写入
#define CSN  BIT0  //每次SPI前一个下降沿,SPI后上升沿
#define MOSI BIT1
#define MISO BIT2
#define SCK  BIT3
#define CE   BIT4
#define IRQ  BIT5
//SPI Commands     command word
#define R_REGISTER   0x00  //R_REGISTER + Register address
#define W_REGISTER   0x20  //W_REGISTER + Register address
#define R_RX_PAYLOAD 0x61
#define W_TX_PAYLOAD 0xA0
#define FLUSH_TX     0xE1
#define FLUSH_RX     0xE2
#define REUSE_TX_PL  0xE3
#define NOP          0xFF
//Register Definitions
      // name    address  data  what
#define CONFIG    0x00  //0x3f:RX_DR IRQ、CRC(2B)、PWR_UP、RX
#define EN_AA     0x01  //0x00:Enhanced ShockBurst? Disabe
#define EN_RXADDR 0x02  //0X01:使能pipe 0
#define SETUP_AW  0x03  //0X03:默认5字节的地址宽度
#define SETUP_RETR 0x04 //0X00: Auto Retransmit disabled  
#define RF_CH      0x05 //0X02: Sets the frequency channel nRF24L01 operates on
#define RF_SETUP   0x06 //0X06:1M、0dBm、no LNA
#define STATUS     0x07 //read and中断服务程序后清标志
#define OBSERVE_TX 0x08 //read only
#define CD         0x09 //用在Enhanced ShockBurst
#define RX_ADDR_P0 0x0A //接收通道0的地址(LSByte is written first)
#define RX_ADDR_P1 0x0B //0x00:不使用
#define RX_ADDR_P2 0x0C //0x00:不使用
#define RX_ADDR_P3 0x0D //0x00:不使用
#define RX_ADDR_P4 0x0E //0x00:不使用
#define RX_ADDR_P5 0x0F //0x00:不使用
#define TX_ADDR  0x10   //0XE7E7E7E7E7:默认发送通道的地址5字节
#define RX_PW_P0 0x11   //0X03:接收通道0的数据宽度为3字节
#define RX_PW_P1 0x12   //0X00:该接收通道不使用
#define RX_PW_P2 0x13   //0X00:该接收通道不使用
#define RX_PW_P3 0x14   //0X00:该接收通道不使用
#define RX_PW_P4 0x15   //0X00:该接收通道不使用  
#define RX_PW_P5 0x16   //0X00:该接收通道不使用
#define FIFO_STATUS 0x17//read only

uchar Rx_Address[5]={0x09,0x87,0x65,0x43,0x21};//设置接收端的地址
uchar Rx_date=0;    //要的数据

void clk_sys_init();   //MCLK = SMCLK = 4M
void io_nrf_init();    //无线端口初始化(P2)
void nrf24l01_on();    //nrf24l01 POWER ON
void wr_spi_byte(uchar date);
void wr_spi(uchar command_address,uchar config_date);
void rx_nrf_init();
void Set_Rx_Address(); //设置接收端的地址
void CE_up();          //CE 高电平,接收模式
void Reset_Rx_DS();    //清除标志位
uchar rd_spi_byte();   //从寄存器读取一字节
void rd_fifo();        //读FIFO
void flush_payload();  //清空FIFO

void delay_us();       //进入函数需8条指令的时间,2 us
void delay_1_5ms();    //1.5ms  
void delay(uint time);
void delay_130us();  //需要 520 * (1/4M)=130us
/************************主程序******************************/
void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  
  Reset_Rx_DS();  //清除标志位
  clk_sys_init();     //MCLK = SMCLK = 4M
  io_nrf_init();
  rx_nrf_init();    //初始化配置字  
  Set_Rx_Address(); //设置端址   
  
  nrf24l01_on();    //PWR_UP、TX_DS、IRQ、EN CRC、rX
  delay_1_5ms();    //1.5ms  6000 *(1/4M)= 1.5ms  
  
  CE_up();       //CE 高电平,接收模式  
  delay_130us();
  //_EINT();    //GIE

   while(P2IN & IRQ);
     rd_fifo();
     Reset_Rx_DS();  //清除标志位
     flush_payload();
      P1OUT ^= BIT4;
  
}
/****************************初始化程序************************/
void clk_sys_init()
{  
  uint i;
    BCSCTL1 &= ~XT2OFF;
  do
  {
    IFG1 &=~OFIFG;
    for(i=0;i<0xff;i++);
  }
  while(!(IFG1 & OFIFG));
  BCSCTL2 |= SELM1 + SELS;  //MCLK = SMCLK = 4M
}
void io_nrf_init()
{
  P2DIR |= CSN + MOSI + SCK + CE;  //SOMI , IRQ INPUT
  P2OUT=0;
  P2OUT |= CSN;
// P2IES |= IRQ;  //下降沿置标志位
// P2IE |= IRQ;
  P1DIR |= BIT4;  //LED
}
/************************无线模块程序*************************/
void nrf24l01_on()
{
  wr_spi(W_REGISTER + CONFIG,0x3f);  //only rx_dr interrupt enable
}  
void wr_spi(uchar command_address,uchar config_date)
{
  P2OUT |=CSN;
  P2OUT &=~CSN;
  wr_spi_byte(command_address);
  wr_spi_byte(config_date);
  P2OUT |= CSN;
}
void rx_nrf_init()                  
{
  wr_spi(W_REGISTER + EN_AA,0x00);              
  wr_spi(W_REGISTER + EN_RXADDR,0x01);
  wr_spi(W_REGISTER + SETUP_AW,0x03);
  wr_spi(W_REGISTER + SETUP_RETR,0x00);  
  wr_spi(W_REGISTER + RF_CH,0x00);   
  wr_spi(W_REGISTER + RF_SETUP,0x06);
  wr_spi(W_REGISTER + RX_PW_P0,0x01);  //1 byte
  //wr_spi(W_REGISTER + RX_PW_P1,0x00);  //写不写无所谓,通道没允许
  //wr_spi(W_REGISTER + RX_PW_P2,0x00);   
  //wr_spi(W_REGISTER + RX_PW_P3,0x00);
  //wr_spi(W_REGISTER + RX_PW_P4,0x00);   
  //wr_spi(W_REGISTER + RX_PW_P5,0x00);  
}
void Set_Rx_Address() //设置发送端的地址
{
  uchar i=0;
  P2OUT |= CSN;
  P2OUT &=~ CSN;
  _NOP();
  wr_spi_byte(W_REGISTER + RX_ADDR_P0);  
  for(i=0;i<5;i++)
  {
   wr_spi_byte(Rx_Address);  
  }         
  P2OUT |= CSN;
}

void CE_up()           //CE 高电平,接收模式
{
  delay(800);
  P2OUT |= CE;
  delay(8000);
  P2OUT &=~ CE;
}
void Reset_Rx_DS()   //清除标志位
{
  wr_spi(W_REGISTER + STATUS,0x4e);
}
void wr_spi_byte(uchar date)
{
  uchar bit;
  P2OUT &=~ SCK;  //时钟低电平
  delay(1);
  for(bit=0;bit<8;bit++)
  {                           //先高位,后低位
    if(date & BIT7)
      P2OUT |= MOSI;
    else
      P2OUT &=~ MOSI;     
      // _NOP();_NOP();_NOP();_NOP();  //数据建立时间 1us
      P2OUT |= SCK;
      delay(2);
    date <<= 1;     //一条指令的时间
      //_NOP();_NOP();_NOP();         //数据保持时间 1us
      P2OUT &=~ SCK;
     delay(2);
  }
   delay(1);
}
void rd_fifo()  //读FIFO
{
  P2OUT |= CSN;
  P2OUT &=~ CSN;
  wr_spi_byte(R_RX_PAYLOAD);  
  Rx_date=rd_spi_byte();
  P2OUT |= CSN;
}

uchar rd_spi_byte()   //从寄存器读取一字节
{
  uchar buf=0,i=0;
   P2OUT &=~ SCK;
  delay(1);
for(i=0;i<8;i++)
{   
   P2OUT |= SCK;
   delay(1);
    buf<<=1;
   if(P2IN & MISO)
    buf |= BIT0;

   P2OUT &=~ SCK;
   delay(1);

}
   delay(1);
   P2OUT |= CSN;  
  return buf;
}
void flush_payload()
{
  P2OUT |= CSN;
  P2OUT &=~ CSN;
  wr_spi_byte(FLUSH_RX);            
  P2OUT |= CSN;   
}
/***************************延时程序**************************/
void delay_us()
{
   ;
}
void delay_1_5ms()
{
  uint i=0,j=0;
  for(i=0;i<30;i++)
    for(j=0;j<38;j++)
      ;
}
void delay(uint time)
{
  uint i;
  for(i=0;i     ;
}
void delay_130us()
{
  uint i=0;
  for(i=0;i<100;i++);
}
/***************************中断程序**************************/
/*#pragma vector=PORT2_VECTOR
__interrupt void p2(void)
{
  P1OUT ^= BIT4;  //LED
  P2IFG =0;
}*/
 
 
 

回复

2641

帖子

0

TA的资源

五彩晶圆(中级)

4
 
I2C读取SD2200(自带电池)实时时钟驱动代码:
extern void delay(unsigned int i);

unsigned char Now_Date[8];//={0x08,0x08,0x13,0x03,0x10,0x45,0x00};//时钟,读/写时钟都是靠这个数据
                   //进行操作,时间格式为“年,月,日,星期,时,分,秒”
                   //Now_Date中放入十进制的数,并使用WRITE_TIME()函数进行时钟的写入

unsigned char set_time[8];//set_time中放入BCD码的数,并使用WRITE_TIME1()函数进行时钟的写入
void iic_init(void)
{
  P9SEL=0x37;
//  P9DIR|=BIT2;
//  P9DIR|=BIT1;
  UCB2CTL1 |= UCSWRST;                      // Enable SW reset
  UCB2CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
  UCB2CTL1 = UCSSEL_2 + UCSWRST;//+UCTR;            // Use SMCLK
  UCB2BR0 = 50;                             // fSCL = SMCLK/50 = ~320kHz
  UCB2BR1 = 0;
  UCB2I2CSA =0x32;// 0x48;                        // Slave Address is 048h
  UCB2CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
}
/***************************************************
*函数名称:read_write_time_year_send
*功能描述:读/写SD2200时钟模块的年、月、日、时、分、秒
*入口参数:r1w0,1:表示读取。0:表示写入
*出口参数:无
***************************************************/
void read_write_time_year_send(unsigned char r1w0)//1read 0write
{//65读 64 写
  unsigned char Temp[7]={0,0,0,0,0,0,0};//临时寄存器
  unsigned char Temp_1[7]={0,0,0,0,0,0,0};//临时寄存器
  unsigned char i;
  unsigned int j;
  if(r1w0==1)//如果是要进行读取操作
  {
      UCB2CTL1 |= UCSWRST;                      // Enable SW reset
      UCB2CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
      UCB2CTL1 = UCSSEL_2 + UCSWRST;//+UCTR;            // Use SMCLK
      UCB2BR0 = 50;                             // fSCL = SMCLK/50 = ~320kHz
      UCB2BR1 = 0;
      UCB2I2CSA =0x32;// 0x48;                        // Slave Address is 048h
      UCB2CTL1 &= ~UCSWRST;
      __delay_cycles(16);
      UCB2CTL1 |= UCTXSTT;//输出一个开始信号
      while(1)
      {
         if(UCB2IFG&UCNACKIFG)break;//如果没有回发应答信号
         if((UCB2CTL1 & UCTXSTT)==0)break;//如果有应答信号
      }
      if((UCB2IFG&UCNACKIFG)==0)//如果有应答信号
      {
        for(i=0;i<7;i++)
        {
          for(j=0;j<600;j++)
          {
             __delay_cycles(1); //1us
             if((UCB2IFG&UCRXIFG)==1)
             {
               Temp = UCB2RXBUF;//把读取出来的时间值存放到Temp中去
               break;//如果接收数据完成,就退出
             }
          }
          if(i==6) UCB2CTL1 |= UCTXSTP;
        }
      }else UCB2CTL1 |= UCTXSTP;
      
      for(i=0;i<7;i++)
      {//读出来的数据进行处理
          for(j=0;j<8;j++)
          {
            if((Temp&0x80)==0x80) Now_Date|=0x80;
            else Now_Date&=~0x80;
            if(j<7)
            {
              Now_Date=Now_Date>>1;
            }
            Temp=Temp<<1;
          }
       }
       Now_Date[4]&=0x3f;
       Now_Date[5]&=0x7f;
       Now_Date[6]&=0x7f;
       for(i=0;i<7;i++)
       {
          Now_Date=(Now_Date/16)*10+Now_Date%16;//把读取时间的两位BCD转化为真实数值
       }
      Now_Date[7]=(unsigned char)(Now_Date[5]/5);
  }else//如果是要进行写入操作
  {
      UCB2CTL1 |= UCSWRST;                      // Enable SW reset
      UCB2CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
      UCB2CTL1 = UCSSEL_2 + UCSWRST+UCTR;            // Use SMCLK
      UCB2BR0 = 50;                             // fSCL = SMCLK/50 = ~320kHz
      UCB2BR1 = 0;
      UCB2I2CSA =0x32;// 0x48;                        // Slave Address is 048h
      UCB2CTL1 &= ~UCSWRST;
     __delay_cycles(16);
      for(i=0;i<7;i++)
      {//数据准备
         Temp = Now_Date;
         Temp = (Temp/10)*16+(Temp%10); //写时间前将真实数值转化为两位BCD码
      }
      
      for(i=0;i<7;i++)
      {//
          for(j=0;j<8;j++)
          {
            if((Temp&0x80)==0x80) Temp_1|=0x80;
            else Temp_1&=~0x80;
            if(j<7)
            {
              Temp_1=Temp_1>>1;
            }
            Temp=Temp<<1;
          }
      }
      UCB2CTL1 |= UCTXSTT;                    // I2C start condition
      for(i=0;i<7;i++)
      {
          for(j=0;j<600;j++)
          {
             __delay_cycles(1); //1us
             if((UCB2IFG&UCTXIFG)==0x02)
             {
               UCB2TXBUF=Temp_1;
               break;
             }
          }
          if(i==6)
          {
            for(j=0;j<16000;j++)
            {
               if((UCB2IFG&UCTXIFG)==0x02)
               {
                 UCB2CTL1 |= UCTXSTP;//发送一位停止位
                 UCB2IFG&=~UCTXIFG;//清除发送标志
                 break;
               }
            }
          }
      }
  }
}

void write_state_int12(unsigned char state,unsigned char date)
{//61 读状态寄存器1 60写状态寄存器1
  //63读状态寄存器2 62写状态寄存器2
  //69读INT1 寄存器 68写INT1 寄存器
  //6b读INT2 寄存器 6a写INT2 寄存器
  
}

unsigned char read_state_int12(unsigned char state)
{//61 读状态寄存器1 60写状态寄存器1
  //63读状态寄存器2 62写状态寄存器2
  //69读INT1 寄存器 68写INT1 寄存器
  //6b读INT2 寄存器 6a写INT2 寄存器
  unsigned char i=0;
   
  return i;
  
}
/***************************************************
*函数名称:Init_SD2200
*功能描述:初始化时钟
*入口参数:无
*出口参数:无
***************************************************/
void Init_SD2200(void)//后面可以不用,做测试时才用
{
  TIMESTATUS_INT(1);
/*  Now_Date[0]=9;
  Now_Date[1]=11;
  Now_Date[2]=28;
  Now_Date[3]=6;//星期
  Now_Date[4]=14;
  Now_Date[5]=2;
  Now_Date[6]=0;
  WRITE_TIME();//把时钟数据写入时钟芯片*/
}
/***************************************************
*函数名称:IICSTART
*功能描述:开始IIC
*入口参数:无
*出口参数:无
*全局变量:
*调用模块:
***************************************************/
void IICSTART(void)
{      
   TIM_DAT_0;                  //初值设为0
   TIM_CLK_0;                  //初值设为0
   TIM_DAT_DIR_IN;              //设为输入
   TIM_CLK_DIR_IN;              //设为输入
   delay(15);
   TIM_DAT_DIR_OUT;              //设为输出
   delay(15);
   TIM_CLK_DIR_OUT;              //设为输出
   delay(15);
}
/***************************************************
*函数名称:IICSTOP
*功能描述:停止IIC
*入口参数:无
*出口参数:无
*全局变量:
*调用模块:
***************************************************/
void IICSTOP(void)
{
   TIM_DAT_DIR_OUT;        //设为输出
   TIM_CLK_DIR_IN;         //设为输入
   delay(15);
   TIM_DAT_DIR_IN;        //设为输入
   delay(15);
}
/***************************************************
*函数名称:BITOUT
*功能描述:发送一位数据,注意:在程序中端口的高低电平的变化是靠外部的上拉电阻,因此只需要改变
*        端口的方向寄存器,就可以实现高低电平的输出,同时需要在初始化时对输出寄存器赋值为0
*入口参数:unsigned char t
*出口参数:无
*全局变量:
*调用模块:usleep();
***************************************************/
void BITOUT(unsigned char t)
{
   if(t) TIM_DAT_DIR_IN;  //设为输入
   else TIM_DAT_DIR_OUT;  //设为输出
   delay(15);
   TIM_CLK_DIR_IN;
   delay(15);
   TIM_CLK_DIR_OUT;              
   delay(15);
   return;
}
/***************************************************
*函数名称:BITIN
*功能描述:接收一位数据,注意:在程序中端口的高低电平的变化是靠外部的上拉电阻,因此只需要改变
*        端口的方向寄存器,就可以实现高低电平的输出,同时需要在初始化时对输出寄存器赋值为0
*入口参数:无
*出口参数:k
*全局变量:
*调用模块:
***************************************************/
unsigned char BITIN(void)
{
    unsigned char k;
    TIM_DAT_DIR_IN;              //设为输入
    TIM_CLK_DIR_IN;             //设为输入
    delay(15);
    k = P9IN;
    if((k&0x02)==0x02)k=1;
    else k=0;
    delay(15);
    TIM_CLK_DIR_OUT;
    TIM_DAT_DIR_OUT;
    delay(15);
    return k ;
}
/***************************************************
*函数名称:ACK
*功能描述:
*入口参数:无
*出口参数:无
*全局变量:
*调用模块:BITOUT();
***************************************************/
void ACK(void)
{
   BITOUT(0X00);
   return;
}
/***************************************************
*函数名称:ACK_ERR
*功能描述:
*入口参数:无
*出口参数:无
*全局变量:
*调用模块:
***************************************************/
void ACK_ERR(void)
{
  return;
}
/***************************************************
*函数名称:NOACK
*功能描述:
*入口参数:无
*出口参数:无
*全局变量:
*调用模块:BITOUT();
***************************************************/
void NOACK(void)
{
   BITOUT(0X01);
   return;  
}
/***************************************************
*函数名称:IICWRBYTH_L
*功能描述:IIC发送一个字节数据(高位到低位发送)
*入口参数:unsigned char t:需要发送到数据
*出口参数:无
*全局变量:
*调用模块:BITOUT();BITIN();ACK_ERR();
***************************************************/
void IICWRBYTH_L(unsigned char t)
{
    unsigned char i,j;//h->l高位到低位发送
   
    for(i=0;i<8;i++)
    {
      j=0x80;
      j=j>>i;//右移
      if((j&t)==j)
         BITOUT(0x01);
      else
         BITOUT(0x00);
    }
    i=BITIN();
    ACK_ERR();
    return;
}
/***************************************************
*函数名称:IICWRBYTL_H
*功能描述:IIC发送一个字节数据(低位到高位发送)
*入口参数:unsigned char t:需要发送到数据
*出口参数:无
*全局变量:
*调用模块:BITOUT();BITIN();ACK_ERR();
***************************************************/
void IICWRBYTL_H(unsigned char t)
{
   unsigned char i,j;//L->H低位到高位发送
   
   for(i=0;i<8;i++)
   {
     j=1;
     j=j<      if((j&t)==j)
        BITOUT(0x01);
     else
        BITOUT(0x00);
   }
   i=BITIN();
   ACK_ERR();
   return;
}
/***************************************************
*函数名称:RXH_L
*功能描述:IIC接收一个字节数据(高位到低位)
*入口参数:无
*出口参数:unsigned char t:接收到的数据
*全局变量:
*调用模块:BITIN();
***************************************************/
unsigned char RXH_L(void)
{
  unsigned char i,j,k;
  k=0;
  for(i=0;i<8;i++)
  {
    j=BITIN();
    k |= j;
    k = k<<1;                 //k = k<   }
  return k;
}
/***************************************************
*函数名称:RXL_H
*功能描述:IIC接收一个字节数据(低位到高位)
*入口参数:无
*出口参数:unsigned char t:接收到的数据
*全局变量:
*调用模块:BITIN();
***************************************************/
unsigned char RXL_H(void)
{
  unsigned char i,j,k,l;
  
  j=0;
  k=0;
  for(i=0;i<8;i++)
  {
    l=BITIN();
    j = l<     k |= j;
  }
  return k;
}
/***************************************************
*函数名称:TIME_TESTMODE
*功能描述:
*入口参数:无
*出口参数:无
*全局变量:
*调用模块:IICSTART();IICWRBYTH_L();IICSTOP();
***************************************************/
void TIME_TESTMODE(void)
{////SD2200该函数需重新编写
  IICSTART();
  IICWRBYTH_L(0x6e);
  IICSTOP();
  return;
}
/***************************************************
*函数名称:TIMESTATUS_INT
*功能描述:
*入口参数:flag_200_220:当选用的时钟芯片为2000时为0,选用2200时为1
*出口参数:无
*全局变量:
*调用模块:IICSTART();IICWRBYTH_L();IICWRBYTL_H();IICSTOP();usleep();
***************************************************/
void TIMESTATUS_INT(unsigned char flag_200_220)
{
   IICSTART();
   if(flag_200_220)
   {//sd2200
     IICWRBYTH_L(0x60);//写状态寄存器1
     IICWRBYTL_H(0x02);//设置成24小时格式
     IICSTOP();
     IICSTART();
     IICWRBYTH_L(0x62);//写状态寄存器2
     IICWRBYTL_H(0X00);////07 int1 每分钟固定中断,INT1报警中断
     IICSTOP();
   }
   else
   {//sd2000
     IICWRBYTH_L(0x62);//写状态寄存器
     delay(15);
     IICWRBYTL_H(0X5A);////int1 每分钟固定中断,INT2报警中断
     IICSTOP();
   }
   return;
}
/***************************************************
*函数名称:BJING_INT2REG_SET
*功能描述:
*入口参数:char *p
*出口参数:无
*全局变量:
*调用模块:IICSTART();IICWRBYTH_L();IICWRBYTL_H();IICSTOP();
***************************************************/
void BJING_INT2REG_SET(char *p)
{////SD2200该函数需重新编写
    unsigned char i;   
    IICSTART();
    IICWRBYTH_L(0x6a);
    for(i=0;i<2;i++)IICWRBYTL_H(*(p+i));
    IICSTOP();     
}
/***************************************************
*函数名称:READ_TIME
*功能描述:读时钟,一次性把年、月、日、时、分、秒都读取出来
*入口参数:无
*出口参数:无
*全局变量:
*调用模块:IICSTART();IICWRBYTH_L();RXL_H();IICSTOP();NOACK();
***************************************************/
void READ_TIME(void)//(char gs,unsigned int address)//char *p)
{
     unsigned char i,j,k;
     unsigned int lj;
     IICSTART();
     IICWRBYTH_L(0x65);
     for(i=0;i<7;i++)
     {
        Now_Date=RXL_H();
        ACK();
     }
     Now_Date[4]&=0x3f;//24小时时,读取数据要屏蔽掉小时数据的第6位和第7位
     Now_Date[6]&=0x7f;
     Now_Date[5]&=0x7f;
     NOACK();
     IICSTOP();
     /////////////////读取时间后将两位BCD码转化为真实数值///////////
     for(i=0; i<7; i++)
     {
        j=(Now_Date&0x0f);
        k=(Now_Date>>4);
        lj=k;
        lj<<=3;
        lj+=k;
        lj+=k;// Now_Date=(unsigned char)(k*10+j);
        Now_Date=(unsigned char)(lj+j);
     }
     Now_Date[5]&=0x3f;
     Now_Date[7]=(unsigned char)(Now_Date[5]/5);
     /////////////////读取时间后将两位BCD码转化为真实数值///////////
}
/***************************************************
*函数名称:WRITE_TIME
*功能描述:把十进制的Now_Date写入到时钟
*入口参数:无
*出口参数:无
***************************************************/
void WRITE_TIME(void)//(char gs,char *p)
{
    unsigned char i,Temp[7];
    IICSTART();
    IICWRBYTH_L(0x64);
    /////////////////写时间前将真实数值转化为两位BCD码///////////
    for(i=0;i<7;i++)
    {
       Temp = Now_Date;
       Temp = (Temp/10)*16+(Temp%10); //写时间前将真实数值转化为两位BCD码
       IICWRBYTL_H(Temp);
    }
    IICSTOP();
    return;
}
/***************************************************
*函数名称:WRITE_TIME1
*功能描述:把BCD码的数据写入到时钟
*入口参数:无
*出口参数:无
***************************************************/
void WRITE_TIME1(void)//(char gs,char *p)
{
      unsigned char Temp[7]={0,0,0,0,0,0,0};//临时寄存器
      unsigned char Temp_1[7]={0,0,0,0,0,0,0};//临时寄存器
      unsigned char i=0;
      unsigned int j=0;
      WDTCTL=WDTPW+WDTCNTCL+WDTSSEL_1;

      UCB2CTL1 |= UCSWRST;                      // Enable SW reset
      UCB2CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
      UCB2CTL1 = UCSSEL_2 + UCSWRST+UCTR;            // Use SMCLK
      UCB2BR0 = 50;                             // fSCL = SMCLK/50 = ~320kHz
      UCB2BR1 = 0;
      UCB2I2CSA =0x32;// 0x48;                        // Slave Address is 048h
      UCB2CTL1 &= ~UCSWRST;
      __delay_cycles(16);
      for(i=0;i<7;i++)
      {//数据准备
         Temp = set_time;
      }
      for(i=0;i<7;i++)
      {//
          for(j=0;j<8;j++)
          {
            if((Temp&0x80)==0x80) Temp_1|=0x80;
            else Temp_1&=~0x80;
            if(j<7)
            {
              Temp_1=Temp_1>>1;
            }
            Temp=Temp<<1;
          }
      }
      UCB2CTL1 |= UCTXSTT;                    // I2C start condition
      for(i=0;i<7;i++)
      {
          for(j=0;j<600;j++)
          {
             __delay_cycles(1); //1us
             if((UCB2IFG&UCTXIFG)==0x02)
             {
               UCB2TXBUF=Temp_1;
               break;
             }
          }
          if(i==6)
          {
            for(j=0;j<16000;j++)
            {
               if((UCB2IFG&UCTXIFG)==0x02)
               {
                 UCB2CTL1 |= UCTXSTP;//发送一位停止位
                 UCB2IFG&=~UCTXIFG;//清除发送标志
                 break;
               }
            }
          }
      }
    return;
}

/***************************************************
*函数名称:SDA2200_INT_Init
*功能描述:2200时钟芯片中断功能初始化
*入口参数:无
*出口参数:无
*全局变量:
*调用模块:
***************************************************/
/*
void SDA2200_INT_Init(void)
{
    alt_irq_register(SDA2200_INT_IRQ,0,SDA2200_INT_ISR);
    IOWR_ALTERA_AVALON_PIO_EDGE_CAP (SDA2200_INT_IRQ ,0x00);
    IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA2200_INT_BASE,0x00);
    IOWR_ALTERA_AVALON_PIO_IRQ_MASK (SDA2200_INT_BASE,0x01);
}*/
/***************************************************
*函数名称:SDA2200_INT_ISR
*功能描述:INT1一分钟中断服务程序
*入口参数:
*出口参数:无
*全局变量:
*调用模块:
***************************************************/
/*
void SDA2200_INT_ISR (void * context,alt_u32 id)
{
  //static unsigned char i=0;
  //int si = IORD_ALTERA_AVALON_PIO_DATA(SDA2200_INT_BASE)&0x01;
  IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA2200_INT_BASE,0x00);
  IOWR_ALTERA_AVALON_PIO_IRQ_MASK (SDA2200_INT_BASE,0x00);
  xs_fzh_flag = 1;   
  IOWR_ALTERA_AVALON_PIO_EDGE_CAP(SDA2200_INT_BASE, 0);
  IOWR_ALTERA_AVALON_PIO_IRQ_MASK(SDA2200_INT_BASE,0x01);
}*/
 
 
 

回复

702

帖子

0

TA的资源

一粒金砂(高级)

5
 
好东西
 
个人签名你好呀
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

6
 
 
个人签名我的博客
 
 

回复

2641

帖子

0

TA的资源

五彩晶圆(中级)

7
 
读18B20代码:
#include
typedef unsigned char uchar;
typedef unsigned int  uint;

#define DQ1 P1OUT |= BIT6
#define DQ0 P1OUT &= ~BIT6
#define DQ_in   P1DIR &= ~BIT6
#define DQ_out  P1DIR |= BIT6
#define DQ_val  (P1IN & BIT6)

/*******************************************************************************
函数名称:DelayNus
功    能:实现N个微秒的延时
参    数:n--延时长度
返回值  :无
说明    :定时器A的计数时钟是1MHz,CPU主频8MHz
          所以通过定时器延时能够得到极为精确的
          us级延时
*******************************************************************************/
void DelayNus(uint n)
{
    CCR0 = n;
    TACTL |= MC_1;           //增计数到CCR0
    while(!(TACTL & BIT0));   //等待
    TACTL &= ~MC_1;          //停止计数
    TACTL &= ~BIT0;          //清除中断标志
}
/*******************************************************************************
函数名称:Init_18B20
功    能:对DS18B20进行复位操作
参    数:无
返回值  :初始化状态标志:1--失败,0--成功
*******************************************************************************/
uchar Init_18B20(void)
{
    uchar Error;
   
    DQ_out;
    _DINT();
    DQ0;
    DelayNus(500);
    DQ1;
    DelayNus(55);
    DQ_in;
    _NOP();
    if(DQ_val)      
    {
        Error = 1;          //初始化失败
    }
    else
    {
        Error = 0;          //初始化成功
    }
    DQ_out;
    DQ1;
    _EINT();
   
    DelayNus(400);
   
    return Error;
}
/*******************************************************************************
函数名称:Write_18B20
功    能:向DS18B20写入一个字节的数据
参    数:wdata--写入的数据
返回值  :无
*******************************************************************************/
void Write_18B20(uchar wdata)
{
    uchar i;
   
    _DINT();
    for(i = 0; i < 8; i++)
    {
        DQ0;
        DelayNus(6);            //延时6us
        if(wdata & 0X01)    DQ1;
        else                DQ0;
        wdata >>= 1;
        DelayNus(50);           //延时50us
        DQ1;
        DelayNus(10);           //延时10us
    }
    _EINT();
}
/*******************************************************************************
函数名称:Read_18B20
功    能:从DS18B20读取一个字节的数据
参    数:无
返回值  :读出的一个字节数据
*******************************************************************************/
uchar Read_18B20(void)
{
    uchar i;
    uchar temp = 0;
   
    _DINT();
    for(i = 0; i < 8; i++)
    {
        temp >>= 1;
        DQ0;
        DelayNus(6);            //延时6us
        DQ1;
        DelayNus(8);            //延时9us
        DQ_in;
        _NOP();
        if(DQ_val)   temp |= 0x80;
        DelayNus(45);           //延时45us
        DQ_out;
        DQ1;
        DelayNus(10);           //延时10us
    }
    _EINT();
   
    return  temp;
}

/*******************************************************************************
函数名称:Skip
功    能:发送跳过读取产品ID号命令
参    数:无
返回值  :无
*******************************************************************************/
void Skip(void)
{
    Write_18B20(0xcc);
}
/*******************************************************************************
函数名称:Convert
功    能:发送温度转换命令
参    数:无
返回值  :无
*******************************************************************************/
void Convert(void)
{
    Write_18B20(0x44);
}
/*******************************************************************************
函数名称:Read_SP
功    能:发送读ScratchPad命令
参    数:无
返回值  :无
*******************************************************************************/
void Read_SP(void)
{
    Write_18B20(0xbe);
}
/*******************************************************************************
函数名称:ReadTemp
功    能:从DS18B20的ScratchPad读取温度转换结果
参    数:无
返回值  :读取的温度数值
*******************************************************************************/
uint ReadTemp(void)
{
    uchar temp_low;
    uint  temp;
   
    temp_low = Read_18B20();      //读低位
    temp = Read_18B20();     //读高位
    temp = (temp<<8) | temp_low;
   
    return  temp;
}

/*******************************************************************************
函数名称:ReadTemp
功    能:控制DS18B20完成一次温度转换
参    数:无
返回值  :测量的温度数值
*******************************************************************************/
uint Do1Convert(void)
{
    uchar i;
   
    do
    {
        i = Init_18B20();
    }
    while(i);
    Skip();
    Convert();
    for(i = 20; i > 0; i--)  
        DelayNus(60000); //延时800ms以上
    do
    {
        i = Init_18B20();
    }
    while(i);
    Skip();
    Read_SP();
    return ReadTemp();
}
 
 
 

回复

5015

帖子

13

TA的资源

裸片初长成(初级)

8
 
先顶了
 
 
 

回复

5015

帖子

13

TA的资源

裸片初长成(初级)

9
 
铁电,美光的吗
 
 
 

回复

2641

帖子

0

TA的资源

五彩晶圆(中级)

10
 

回复 9楼 wstt 的帖子

FM25L256
 
 
 

回复

7228

帖子

192

TA的资源

五彩晶圆(高级)

11
 
好东西啊 支持支持
 
 
 

回复

5979

帖子

8

TA的资源

版主

12
 
写的很好啊
 
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复

755

帖子

0

TA的资源

五彩晶圆(初级)

13
 
好东西
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

14
 
mark

铁电
 
 
 

回复

1729

帖子

0

TA的资源

五彩晶圆(初级)

15
 
好多啊!支持啊!
 
 
 

回复

324

帖子

0

TA的资源

一粒金砂(高级)

16
 
好东西~~~
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

17
 
用不上,但是要顶,楼主辛苦啊
 
 
 

回复

391

帖子

1

TA的资源

一粒金砂(高级)

18
 

谢谢楼主的分享

学习了~灰常灰常的感谢
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

19
 
版主好厉害,我在做一个有Msp430f2618控制照度传感器BH1750fvi测光照的东西。现在就是那个I2C接口不会用。想请教一下。望不吝赐教。我的邮箱是362496382@qq.com
 
 
 

回复

2万

帖子

71

TA的资源

管理员

20
 

回复 19楼 yddinxidian 的帖子

可以讲问题抛出来大家一起讨论
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表