MSP430与ATMEL 93C46通讯子程序

发布者:binggege最新更新时间:2016-08-16 来源: eefocus关键字:MSP430  ATMEL  93C46  通讯子程序 手机看文章 扫描二维码
随时随地手机看文章
/*

;Discription:本程序为ATMEL93C46与MSP430通讯程序
  1。管脚连接如下:
      93C46           MSP430
      CS              P4。0
      CK              P4。1
      DI              P4。2
      DO              P4。3
  2。晶振:4/8M晶振,4M晶振4分频,选择8M时8分频,选择XT2为MCLK
  3。Date:2006.03.23,Write by: Benny Chen
    
*/
#define CS_93C46_LOW P4OUT &= ~0x01
#define CS_93C46_HIGH P4OUT |= 0x01
#define SK_93C46_LOW P4OUT &= ~0x02
#define SK_93C46_HIGH P4OUT |= 0x02
#define DO_93C46_LOW ~(P4IN & 0x08)
#define DO_93C46_HIGH P4IN & 0x08
#define DI_93C46_LOW P4OUT &= ~0x04
#define DI_93C46_HIGH P4OUT |= 0x04

#define CMD_DisWrite 0x00
#define CMD_WriteAll 0x20  // x020:8bit     0x10:16bit,
#define CMD_EraseAll 0x40  // x040:8bit     0x20:16bit,
#define CMD_EnWrite 0x60   //0x60:8bit      0X30:16BIT
#define CMD_Write 0x80     //8bit:0X80(0 1A6A5A4 A3A2A1A0)   16bit:0X40(01A5A4 A3A2A1A0)
#define CMD_Read 0x100     //8bit:0X100(10A6A5A4 A3A2A1A0)   16bit:0X80(10A5A4 A3A2A1A0)
#define CMD_Erase 0x180    //8bit:0X180(1 1A6A5A4 A3A2A1A0)   16bit:0X80(11A5A4 A3A2A1A0)
#define START_Bit 0x200    //8bit:0x200      16bit:0x100


/*************************************************************/
/*Name         : Delay() */
/*Discription  : 延时子程序/
/*************************************************************/
void Delay(unsigned int num)
{
while(--num);
}

/*************************************************************/
/*Name         : START_93C46() */
/*Discription  : 启动93C46 */
/*************************************************************/
void START_93C46()
{
CS_93C46_HIGH; /*开启93C46*/
CS_93C46_LOW;
DI_93C46_LOW;
SK_93C46_LOW;
CS_93C46_HIGH;
Delay(1000);
}

/****************************************************************/
/*Name         :END_93C46() */
/*Discription  :用于93C46的结束
/****************************************************************/
void END_93C46()
{
CS_93C46_LOW;
DI_93C46_HIGH;
SK_93C46_HIGH;
}

/*************************************************************/
/*Name         :SEND_DATA_93C46() */
/*Discription  :在93C46启动下,送入指定位数的数据 */
/*输入: op_data 要输入的数据 */
/* num 输入的位数 */
/*************************************************************/
void SEND_DATA_93C46(unsigned int Op_Data,unsigned char Num)
{
unsigned char i;
Op_Data = Op_Data << (16 - Num); /*左移去掉无用位*/
for(i = Num; i > 0; i --)
{
if ((Op_Data & 0X8000) ==0 ) DI_93C46_LOW;
else DI_93C46_HIGH;
SK_93C46_HIGH;
SK_93C46_LOW;
Op_Data <<= 1;
}
}

/*********************************************************/
/*Name         : EWEN_93C46() */
/*Discription  :93C46的编程启动.操作码(100 11XXXXX) */
/*********************************************************/
void EWEN_93C46()
{
START_93C46();
SEND_DATA_93C46(START_Bit + CMD_EnWrite, 0X0A);
END_93C46();
}

/***********************************************************************/
/*Name         : EWDS_93C46() */
/*Discription  : 93C46的编程关闭.操作码(8bit:100 00XXXXX    16bit:100 00XXXX) */
/**********************************************************************/
void EWDS_93C46()
{
START_93C46();
SEND_DATA_93C46(START_Bit + CMD_DisWrite, 0X0A);
END_93C46();
}

/***********************************************************************/
/*Name         :READ() */
/*Discription  :93C46的字读取程序 */
/*输入:要读取的字地址(8bit:7位,16bit:6位) */
/*输出:读取的字数值 */
/**********************************************************************/
unsigned int Read_One(unsigned char Address)
{
unsigned int i;
unsigned int Result;
START_93C46();
SEND_DATA_93C46(START_Bit + CMD_Read + Address, 0X0A);
Result = 0; /*存放返回数据的缓冲先清零*/
for(i =8; i >0; i--) /*循环读出8个数据*/
{
Result = Result << 1;
SK_93C46_HIGH;
SK_93C46_LOW;
if (DO_93C46_HIGH) Result = Result | 0X01;

}
END_93C46();
return Result;
}

/**********************************************************************/
/*Name         :WRITE() */
/*Discription  :93C46的字写入程序 */
/*输入: address 要写入的字地址(6位) */
/* op_data 要写入的数据(16位) */
/*输出: 读取的字数值 */
/**********************************************************************/
unsigned int Write_One(unsigned char Address,unsigned int Op_Data)
{
unsigned char ErrorFlag;
unsigned int mCount;
EWEN_93C46();
START_93C46();
SEND_DATA_93C46(START_Bit + CMD_Write + Address, 0x0A);
SEND_DATA_93C46(Op_Data,0X08);
CS_93C46_LOW;
CS_93C46_HIGH;
ErrorFlag = 0;
mCount = 50000; 
while (DO_93C46_LOW)
{
if (! --mCount)
{
ErrorFlag = 1;
break;
}
}
END_93C46();
EWDS_93C46(); /*返回表示擦除状态的特征*/
return ErrorFlag;
}

/************************************************************************/
/*Name         :ERASE() */
/*Discription  :93C46的字擦除程序 */
/*输入: address 要擦除的字地址(6位) */
/************************************************************************/
unsigned int Erase_One(unsigned char Address)
{
unsigned char ErrorFlag;
unsigned int mCount;
EWEN_93C46();
START_93C46();
SEND_DATA_93C46(START_Bit + CMD_Erase + Address, 0X0A);
CS_93C46_LOW;
CS_93C46_HIGH;
ErrorFlag = 0;
mCount = 50000; //设置一个最大延时等待数值.不同的晶振下延时不同*/
while (DO_93C46_LOW)
{
if (! --mCount)
{
ErrorFlag = 1;
break;
}
}
END_93C46();
EWDS_93C46(); /*返回表示擦除状态的特征*/
return ErrorFlag;
}

/**********************************************************************/
/*Name         :ERAL() */
/*Discription  :93C46的全部擦除程序 */
/**********************************************************************/
unsigned int Erase_All()
{
unsigned char ErrorFlag;
unsigned int mCount;
EWEN_93C46();
START_93C46();
SEND_DATA_93C46(START_Bit + CMD_EraseAll, 0X0A);
CS_93C46_LOW;
CS_93C46_HIGH;
ErrorFlag = 0;
mCount = 50000; /*设置一个最大延时等待数值.注意在不同的晶振下延时是不同的*/
while (DO_93C46_LOW)
{
if (! --mCount)
{
ErrorFlag = 1;
break;
}
}
END_93C46();
EWDS_93C46(); /*返回表示擦除状态的特征*/
return ErrorFlag;
}

/***********************************************************************/
/*Name         :WRAL() */
/*Discription  :93C46的写全部程序 */
/*输入: op_data 要写入的数据(8位) */
/*输出: 读取的字数值 */
/***********************************************************************/
unsigned int Write_All(unsigned int Op_Data)
{
unsigned char ErrorFlag;
unsigned int mCount;
EWEN_93C46();
START_93C46();
SEND_DATA_93C46(START_Bit + CMD_WriteAll, 0X0A);
SEND_DATA_93C46(Op_Data,0X08);
CS_93C46_LOW;
CS_93C46_HIGH;
ErrorFlag = 0;
mCount = 50000; /*设置一个最大延时等待数值.不同晶振下延时是不同*/
while (DO_93C46_LOW)
{
if (! --mCount)
{
ErrorFlag = 1;
break;
}
}
END_93C46();
EWDS_93C46();
return(ErrorFlag);
}

   ORG=HI   内部为16位结构的存储器 64×16
   ORG=LO  内部为8位结构的存储器  128×8
关键字:MSP430  ATMEL  93C46  通讯子程序 引用地址:MSP430与ATMEL 93C46通讯子程序

上一篇:MSP430和实时时钟HT1381的接口程序
下一篇:MSP430F2131读写DS1991

推荐阅读最新更新时间:2024-03-16 15:05

MSP430系列MCU的动态时钟配置分析
   本文结合MSP430系列微处理器,详细论述了通过控制改变MCU的时钟频率来降低功耗的设计方法。   1 功耗产生的原因   在CMOS电路中,功耗损失主要包括静态功耗损失和动态功耗损失两部分。其中静态功耗主要是由反偏PN结的漏电流和晶体管的亚阈值电流引起的,其最主要的形式就是漏电损失。其实CMOS电路理论上不会有静电功耗损失,因为从供应电源到地面没有直接的路径,但实际上晶体管总会有漏电电流的出现,从而出现漏电损失。在0.18μm工艺水平之下,其在功耗中所占比重大约为5%~10%,一般可以忽略(但是随着工艺的提高,供电电压的降低,又使其所占比重逐渐上升)。这样,在CMOS电路中,动态功耗就成了这个系统功耗的主要组成部
[单片机]
<font color='red'>MSP430</font>系列MCU的动态时钟配置分析
TMP275在手持式实时测温仪中的应用
  摘要:设计一种基于TMP275的手持实时测温仪,采用TI公司的低功耗单片机 MSP430F149作为主控芯片,该系统采用I2C总线协议数字温度传感器TMP275对现场温度进行采集,通过低功耗液晶模块进行实时温度显示,该系统具有采集数据准确、抗干扰能力强、功耗低的特点,非常适合于对现场环境温度进行测量与采集。   0 引言   在工业生产、日常生活的很多领域,经常要在现场对温度进行实时的采集、测量与记录,手持式实时测温仪是理想的选择。对于手持设备,功耗是必须要考虑的问题。 MSP430F149单片机是TI推出的一种具有超低功耗16位FLASH单片机,特别适合于对功耗敏感的场合。利用MSP-430F149单片机,可以简便快捷地
[单片机]
TMP275在手持式实时测温仪中的应用
基于MSP430对UART的控制方案
1 #include msp430g2553.h 2 3 typedef unsigned char uchar; 4 typedef unsigned int uint; 5 6 #define LED BIT0 7 #define TXD BIT1 // TXD on P1.1 8 #define RXD BIT2 // RXD on P1.2 9 #define POUT P1OUT 10 11 #define BITTIME_1b 13*4 //1bit宽度 12 #define BITTIME_1b5 13*6 //1.5bit宽度 13 14 uchar bitcnt
[单片机]
畅学多功能实验箱 MSP430F5438 RTC 操作实验
简介: 1、编程要求:利用 C 语言实现 RTC 实时时钟,并且设置闹钟当闹钟时间到就 LED2 亮,能够 安全读时间时 LED1 亮(灭),且在 BCD 模式下。 2、实现功能:实现实时时钟,完成闹钟功能 3、实验现象:LED1 闪烁,LED2 在闹钟时间到后就亮 1.模块原理 如图 ,RTC 由两个分频寄存器 RP0TS,RP1TS 对 RTOSSEL 选择的时钟源进行分频,在日历模式下,时钟源 ACLK=32768,经过 RP0TS,RP1TS 分别 256 和 128 分频率后频率为 1HZ ,提供给 32 位 RTC 寄存器时钟源,通过 RTCSSEL 选择 11 或者 10。每 1S ,RTCSEC(秒)加一秒,加
[单片机]
畅学多功能实验箱 <font color='red'>MSP430</font>F5438 RTC 操作实验
基于MSP430F449的悬挂运动控制系统设计
    在现代的车辆运动、医疗设备和工业控制等系统中,悬挂运动系统的应用越来越多,在这些系统中悬挂运动部件通常是具体的执行机构,因而悬挂部件的运动精确性是整个系统工作效能的决定因素,因而实际实现悬挂运动控制系统的精确控制具有极其重大的现实意义。本系统采用低功耗MSP430F449单片机系统平台设计了悬挂运动控制系统,采用高效的PWM电路,提高电源利用率;红外传感检测,提高纠错能力。由单片机产生脉冲信号驱动有精确步距的步进电动机,电机带动悬挂部件在平面上做特定的准确运动。 1 悬挂运动控制系统设计方案 1.1 电机选取     方案①:直流电机。直流电机的优点是输出功率大,带负载能力强;缺点是不能精确地控制直流电机的转动角度。    
[嵌入式]
突破性新工具使设备可装配更小的电池
目前,我们使用的每种电子设备几乎都存在一个最令人关注的问题,那就是其供电能力。我们希望自己的智能手机、电脑、电动工具和可穿戴健身设备的功耗更低,从而延长它们的续航时间。正是出于这个原因,德州仪器(TI)为那些在其电子产品中采用了TI MSP430™微控制器(MCU)的工程师们推出了能确切知道设备哪些地方耗电以及如何耗电的新技术。 这项新技术被称为EnergyTrace++™,是一种功耗分析系统。一般来说,工程师在运行其设备的MCU中查找“漏洞”需要花费很多时间。在运行系统的软件中,这些漏洞或微小的误差可能会导致不必要的功耗增加。为了在价格不高的MCU中找出这些漏洞,工程师必须先用仪表仔细检查MCU中的每一行代码,而这往往
[手机便携]
富士通选择爱特梅尔 maXTouch解决方案
微控制器及触摸解决方案的领导厂商爱特梅尔公司(Atmel® Corporation)日前宣布,富士通(Fujitsu)已选择 Atmel maXTouch™解决方案来助力docomo的REGZA 系列 T-01C手机的触摸屏。富士通开发的新款手机REGZA 系列 T-01C采用Android平台,由日本移动通信运营商NTT Docomo独家发售。富士通选择爱特梅尔 mXT224触摸控制器是因其具备稳健的功能特性,包括多点触摸、低功耗及更快的触摸响应速度。 富士通的 docomo REGZA 系列T-01C手机是一款带1220 万像素超炫摄像头、4 英寸触摸屏、电视、红外通信、720p 视频录制、GSM、蓝牙 ® 及Wi-
[手机便携]
瞄准FPGAs、ASIC和ASSP,Atmel打造新型可定制金属可编程处理器
爱特梅尔公司(Atmel Corp)表示,该公司将量产一种新的可定制金属可编程32位基于ARM的微控制器,这种微处理器被称为可定制爱特梅尔处理器(Customizable Atmel Processors, CAP)。 爱特梅尔的ASIC的市场营销总监Jay Johnson表示,与通常由FPGA实现的DSP算法相比,新的AT91CAP可定制爱特梅尔处理器所提供的DSP算法性能要高8倍,因而,使功耗和单位IC成本得到极大地降低,下降了30%到50%之多。新的CAP器件将是爱特梅尔现有32位基于ARM7、ARM9及ARM11的AVR32UC3和AVR32 AP7微控制器系列的扩展。 Johnson指出:“对于算法上复杂的设计,设计
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved