冒死分享公司项目外设驱动代码(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; //不选中铁电
}