主题中讨论的其他器件: MSP430F149、 MSP430WARE、 MSP-TS430PZ100USB
大家好、
我将 AT24C1024 EEPROM 与 MSP430F6659微控制器进行通信。
如果我尝试在数据的 LSB 中写入1、那么它可能是微控制器挂起或在一个循环中旋转、当我写入0时、它可以正常工作。
那么、会发生什么问题?
当我同时使用相同的 EEPROM 和相同程序与 MSP430F149进行通信时、它可以正常工作。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好、
我将 AT24C1024 EEPROM 与 MSP430F6659微控制器进行通信。
如果我尝试在数据的 LSB 中写入1、那么它可能是微控制器挂起或在一个循环中旋转、当我写入0时、它可以正常工作。
那么、会发生什么问题?
当我同时使用相同的 EEPROM 和相同程序与 MSP430F149进行通信时、它可以正常工作。
这里有用于在 EEPROM 中写入的 POST 代码。
当我在 EEPROM 中使用此例程写入0xFE 时、它可以正常工作、但当我写入0xFF 时、微控制器会旋转以循环。 它不会从该例程返回。
这意味着当我在 LSB 中写入0时、它可以正常工作、但当我写入1时、它具有一些光绘。
微控制器也会在某些时候重新启动。
void write_i2c (unsigned char data) { unsigned char I2C_count; unsigned char I2C_data; SDA_out;//SDA 作为输出 I2C_data = data; for (I2C_count = 0;I2C_count < 8;I2C_count++) { if (I2C_data & 0x80) { SDA_set; _ delay_cycl_cycles (4000); _ SCL_clr_clrk (4000);_ clr_clr_clr_clrk;}_clr_clr_clrk (clr_set);} //CLK clear __delay_cycles (2000); I2C_DATA <<= 1; } ack(); }
我没有使用任何 EVM。。 我自己制作了 PCB。。。
请查找电路图和程序代码的附件。
e2e.ti.com/.../MSP430F6659-_2800_2_2900_.pdf
#include #include "msp430_math.h"//usedfor 浮点计算 #include // P4 LCD 数据端口 // P7.5 LCD 使能引脚 // P7.4 LCD RS 引脚 #define CS_HIGH P3OUT |= BIT0; #define CS_LOW P3OUT &=~BIT0; #define sdo _high P3IN |= BIT3; #define sdo _low P3IN &=~ ~BIT1;#define P3SDI_HIGH;#define PIT1 |#define PIT3SDI_CL1 | PIT1;#define PIT3SDI_HIGH #define clk_low P3OUT &=~BIT2; //用于 EEPROM ********* #define SDA_SETP7OUT |= BIT6; #define SDA_CLRP7OUT &=~BIT6;//I2C 例程 #define SCL_SETP7OUT |= BIC7; #define SCL_CLRP7OUT &=~BIT4; #define SDA_OUTP7DIR |= BIT6; #define SDA_SET P7OUT 和 BOOST/ BOOST=~ ~BOOST/ BOOST_BOOST/ BOOST/ BOOSTEFFR /********* /#define RS_SETP7OUT |= BIT4; #define RS_CLRP7OUT &=~BIT4;//LCD 控制引脚 #define EN_SETP7OUT |= BIT4; #define EN_CLRP7OUT &=~BIT4; /********* / #define LTC_CLK_SETP6OUT |= BIT4; #define LTC_CLK_CLR P6OUT &=~BIT4;//LTC 1609 SPI 接口 #define LTC_RC_SETP6OUT |= BIT4; #define LTC_RC_CLRP6OUT &=~ ~BIT4;#define LTC_B6OUT 和 R5OUT 继电器|#define P6OUT ON = BIT_REGENT //电流范围更改继电器 #define I_hrelay_off P5OUT &=~BIT2; void clk (); void lcd_data (unsigned char x、unsigned char y、unsigned char z); void lcd_data_indication (unsigned char value1、unsigned char value2);unsigned bit_char value_32 (void c)(void c) (void lcd);void page1);void lcd (void 1);void 命令1 (void 1);void lcd (void 1) void page_3(); void display(); void byteseprate(); void dma(); void initiat_adc(); void write_adc (unsigned char); void read_adc (unsigned char); void off (); void gain (); void convert (); void offset(); void read_hv(); void cycle_count(); void frequency (); void find_rms(); void LTC _read();// LTC void averal();// LTC void switch_assign(); void key_check(); void key_14_m(); void key_12_m(); //******* EEPROM 函数******** void start_i2c (); void write_i2c (unsigned char 数据); void read_i2c (); void end_i2c (); void ack(); void no_ack(); void read_default(); void write_i2c_24bit (unsigned char Add1、unsigned char ADD2、unsigned char value24、unsigned char value16、unsigned char value8); //********* const unsigned int sample []={2048,219,233,2473,2612,2748,2880,3009,3133,3251,336,34,0356,366,3745,3821,388,3946,3995,4034,406,404,404,404,404,40964,409,403,394,336,336,396,336,336,336,3002,386,283,364,336,336,336,336,336,3004,364,364,362,336,3002,386,336,336,336,284,336,336,336,336,336,336,3004, 2748、2612、2473、232、190、2048190、1905、1763、 162、1483、1347、1215、1086、962、844、731、 625、52.6、436、350、274、207、149、 61、 100 149、207、274、274、275、350、434、52.6、625、 731,844,962,1086,1215,1347,1483,1622,1763,1905} ; 易失 性易 失性特征 ADC、I2C_R0、mode_flag、rotate_cur,f4_SMPL、key、hld、z;易失 性无符号字符 adc24、adc16、adc8、c3、c3、key_f_freq、volatile、volatile、te_fp、tureq、unsigned f_fp、tureq、tureq、unsigned、tureq、unsigned f_f_fp、volatile、tureq、unsigned、tureq、volatile、ture_f_f_f_f_fp、voltureq、voltage1、volatile、unt、voltage_f_f_f_f_ft、tage1、voltage1、unt、voltage1、tureq、te_f_f_f_f_f_f_f_unt、voltage1、vol volatile unsigned int v_sample[1000]、c_sample[1000]; volatile unsigned long v_avg[20]、c_avg1[10]、c_avg2[10]; volatile unsigned int lc_acc、lc_v、lc_i、i、j; void main () { WDTCTL = WDTPW | WDTHOLD;//停止 WDT clk (); __DELAY_CYCLS (200000); P4DIR |= BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT4 | BIT6 | BIT4;// LCD 数据引脚 P7DIR |= BIT7DIR |= BIT4 | BIT4 | BIT4 | BIT7;控制引脚 6 | BIT7 | BIT7 | BIT7 | BIT7 | BIT7 LCD_cmd (0x38);//LCD 初始化 __delay_cycles (10000); LCD_cmd (0x0c); _delay_cycles (10000); LCD_cmd (0x01); __delay_cycles (10000); LCD_cmd (0x81); __delay_cycles (10000); LCD_Welcome (); __DELAY_CYCLES (20000000); LCD_cmd (0x01); __DELAY_CYCLES (10000); MODE_1 = 0x00; z = 0; while (1) { start_i2c (); write_i2c (0xA0);//写入命令 write_i2c (0x00);//地址 write_i2c (0x00);//地址 write_i2c (0x02); end_i2c (); __delay_cycles (3000000); _delay_cycles (3000000); __delay_cycles (3000000); //read_i2c_8bit (0x00); start_i2c (); write_i2c (0xA0); WRITE_i2c (0x00); WRITE_i2c (0x00); START_i2c (); //WRITE_i2c (0xA1);//读取命令 //READ_i2c (); end_i2c (); //A = I2C_R0; bit_SEP_32 (3); LCD_cmd (0x80); _ 3、10000_DATA (3);_ 3、10000 (3)周期;LCD_0 LCD_cmd (0xC0); __delay_cycles (10000); LCD_data1 (0x41); __delay_cycles (10000); z = z + 1; a = z; bit_SEL_32 (3); LCD_cmd (0x94); __delay_cycles (10000); LCD_DATA (3、3、0); } void read_default () { read_i2c_8bit (0x00、0x19); temp_1 = I2C_R0; read_i2c_8bit (0x00、0x1A); temp_2 = I2C_R0; read_i2c_8bit (0x00、0x1B); temp_3 = I2C_R0; Breq =(65536U * temp_3)+(256U * temp_2)+ temp_1; Read_i2c_8bit (0x00、0x1C); temp_1 = I2C_R0; Read_i2c_8bit (0x00、0x1D); temp_2 = I2C_R0; READ_i2c_8位(0x00、0x1E); TEMP_3 = I2C_R0; freq1 =(65536U * temp_3)+(256U * temp_2)+ temp_1; READ_i2c_8bit (0x00、0x20); TEMP_1 = I2C_R0; READ_i2C_8位 (0x21、I2C);temp_R0 = 0x21; Read_i2c_8位(0x00、0x22); temp_3 = I2C_R0; kgreq =(65536U * temp_3)+(256U * temp_2)+ temp_1; read_i2c_8bit (0x00、0x23); temp_1 = I2C_R0; read_i2c_8bit (0x24、I2C);temp_R0 Read_i2c_8位(0x00、0x25); temp_3 = I2C_R0; lengthreq =(65536U * temp_3)+(256U * temp_2)+ temp_1; read_i2c_8bit (0x00、0x26); temp_1 = I2C_R0; read_i2c_8bit (0x002C_2;I2C READ_i2c_8位(0x00、0x28); TEMP_3 = I2C_R0; denitireq =(65536U * temp_3)+(256U * temp_2)+ temp_1; READ_itemp_8bit (0x00、0x29); temp_1 = I2C_R0; READ_i2C_2 ;0x2C_R0 = 0x2C、0x2C READ_i2c_8位(0x00、0x2B); TEMP_3 = I2C_R0; avg_smplreq =(65536U * temp_3)+(256U * temp_2)+ temp_1; } //******** EEPROM 写入******** void write_i2c_24bit (unsigned char Add1、unsigned char ADD2、unsigned char value24、unsigned char value16、unsigned char value8) { start_i2c (); write_i2c (0xA0);// write 命令 write_i2c (Add1);// address write_i2c (ADD2);// address_value8 (write_i2c);// end_i2c (); __delay_cycles (30000); } //******** EEPROM 读为******** void read_i2c_8bit (unsigned char ADD4) { start_i2c (); //__delay_cycles (300000); write_i2c (0xA0); //__delay_cycles (300000); //write_i2c (add3); //__delay_cycles (300000); write_i2c (ADD4); //__delay_cycles (300000); start_i2c (); //__delay_cycles (300000); write_i2c (0xA1);//读取命令 //__delay_cycles (3000000); read_i2c (); //__delay_cycles (300000); end_i2c (); //__delay_cycles (300000); } //******* EEPROM 所有功能********* void start_i2c () { SDA_out;//SDA 作为输出 SDA_set; SCL_set; __delay_cycles (2000); SDA_CLR; __delay_cycles (2000); SCL_CLR; __delay_cycles (2000); } void write_i2c (unsigned char data) { unsigned char I2C_count; unsigned char I2C_data; SDA_out;//SDA 作为输出 I2C_data = data;数据; for (I2C_count = 0;I2C_count < 8;I2C_count +) { if (I2C_data & 0x80) ;_ SCCLR_set + cycles;_ 1000);_ 1000 (clr_clr_cl_cl_cl_set);} //CLK clear __delay_cycles (500); I2C_DATA <<= 1; } ack(); } void read_i2c () { unsigned char I2C_count; unsigned char I2C_ACC; SDA_IN; SDA_set; SCL_CLR; _DELAY_CYCLS (400); I2C_ACC = 0x00; I2C_R0 = 0x00; 对于(I2C_COUNT = 0;I2C_COUNT < 7;I2C_COUNT++) { SCL_SET;//CLK SET __DELAY_CYCLS (2000); IF (P7IN & BIT6) { I2C_ACC |= BIT0 ;}< I2C_ACC.0 ~= BIC_ACC.0;I2C_ACC.0 = I2C ACC.E= 1;< SCL_CLR;//CLK 清零 _DELAY_CYCLS (2000); } SCL_SET;//CLK SET __DELAY_CYCLS (2000); IF (P7IN & BIT6) { I2C_ACC |= BIT0; } 否则 { I2C_ACC &=~BIT0; } SCL_CLR;//CLK CLEAR __DELAY_CYCLS (2000); }I2C_RACK = 0; } void end_i2c () { SDA_CLR; //_delay_cycles (500); SCL_set; __delay_cycles (4000); SDA_set; //__delay_cycles (4000); SCL_CLR; __delay_cycles (4000); } void ack() { SDA_in; //while (P3IN & BIT6); SCL_set; __delay_cycles (4000); SCL_CLR; __delay_cycles (2000); SDA_OUT; } void no_ack () { SDA_OUT; __delay_cycles (400); SDA_set; SCL_set; __delay_cycles (4000); SCL_CLR; __DELAY_CYCLLES (4000); } //******** void lcd_welcome() { lcd_cmd (0x80); __delay_cycles (100); lcd_daa("---------- ----"); lcd_cmd (0xC0); __delay_cycles (100); lcd_dataaa (" veer electronics "); lcd_cmd (0x94); __delay_cycles (100); lcd_dataa (" Epstein tester "); lcd_cmd (0xd4); __delay_cycles (100); -lcd -(-dataa (-) ----"); } void LCD_data1 (unsigned char disp)//函数在 LCD 上发送数据 { P4OUT = disp; RS_set;//RS EN_set;//en __delay_cycles (5000); EN_CLR; } LCD_dataaa (unsigned char * disp)//用于将字符串发送到 LCD 的函数{ int x; for (x=0;disp[x]!=0;x++) { LCD_data1 (disp[x]); } // ********* 液晶屏******** void lcd_cmd (unsigned char 命令) { __delay_cycles (8000); P4OUT =命令; RS_CLR; EN_SET; __delay_cycles (5000); en_CLR; //返回; } void bit_sep_32 (unsigned char c) { unsigned char w; //d[10]= 0; for (w=1;w<=c;w++) { h=A/10; d[w]=a%10; d[w]=d[w]+0x30; a=h/10; w++; d[w]=h%10; d[w]=d[w]+0x30; //_delay_cycles (1000); } //返回; } void lcd_data_indication (unsigned char value1、unsigned char value2、unsigned char value3) { P4OUT = value1; lcd_dat (); P4OUT = value2; lcd_dat (); P4OUT = value3; LCD_dat (); //返回; } void LCD_dat () { rs_set;//rs EN_set;//en __delay_cycles (5000); EN_CLR; } void LCD_data (unsigned char x、unsigned char y、unsigned char z) { unsigned char w; for (w=x;w>y;w-)}void LCD_set ;{n_rs =/rs + rs 设置周期;}[n_rs =/rs 设置}/n_rs;/n_rs 设置周期数[n_rs P4OUT ='.'; RS_SET;//RS EN_SET;//en __DELAY_CYCLS (5000); EN_CLR; for (w=y;w>z;w-) { P4OUT = d[w]; rs_set;//rs EN_set;//en __delay_cycles (5000); EN_CLR; } } void clk() { P7SEL |= BIT2 + BIT3; //端口选择 XT2 P3DIR |= BIT4; // SMCLK 设置为引脚 P3SEL |= BIT4; UCSCTL6 &=~XT2OFF; //使能 XT2 UCSCTL3 |= SELREF_5;// FLLref = REFO UCSCTL4 |= SELA_2; // ACLK=REFO,SMCLK=DCO,MCLK=DCO UCSCTL5 |= DIVM_0+DIVS_0;//在这里我们可以控制 MCU 的 clk (对于 ACLK 为+DIVA_2) //循环直到 XT1、XT2和 DCO 稳定-在这种情况下,直到 XFF2 和~ XFFG + XFFG + XFFG + DCOL 标记+ TFFG + T0 ~ //清除故障标志 } while (SFRIFG1&OFIFG);//测试振荡器故障标志 UCSCTL4 |= SELs_5+SELM_5;// SMCLK=MCLK_=XT2 SELM_5__DELAY_CYCLESS(1000) ; // UCSCTL5 |= DIVS_4;// SMCLK=XT2 SELVM_5| 如果正在工作 ,则为 UCLDV_ 4;// CLDC_/ D_
/*-版权所有-、BSD_EX *版权所有(c) 2012、德州仪器(TI)公司 *保留所有权利。 * * 只要 符合以下条件*、允许以源代码和二进制形式重新分发和使用: * *源代码的重新分发必须保留上述版权 声明* 、此条件列表和以下免责声明。 * ** *二进制形式的再发行必须在 *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。 * *** 未经 事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。 * *本软件由版权所有者和贡献者"按原样"提供 *、 不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或 *贡献者都不对任何直接、间接、偶然、特殊、 *模范、 或相应的损害(包括但不限于 *采购替代产品或服务;丧失使用、数据或利润; *或业务中断)、但出于任何责任理论 、*无论是在合同中、严格责任还是由于 使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他) 、*即使已获悉可能会发生此类损坏。 * *** * * MSP430代码示例免责声明 * * MSP430代码示例是自包含的低级程序 ,通常*以 高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认 值*寄存器值和时钟配置等设置、 并且在组合多个示例中的代码时必须*小心以避免潜在的副作用 *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware *了解外设配置的 API 函数库方法。 * **-/版权所有*////********************* // MSP430F665x 演示- DAC12_1、DAC1///输出0.75V 说明:使用增益为1的 DAC12_1和1.5V 基准,// DAC1上输出0.75V。// ACLK = n/a,MCLK = SMCLK =默认 DCO/// MSP430F665x/ -------- // /|\| XIN|-// || |// -|RST XOUT|-// | |// | P6.7/DAC1|->0.75V// | /// P.Thanigai// Texas Instruments Inc.// 2012年10月// 使用 IAR Embedded Workbench 构建版本:5.40 & CCS v5.2//********* #include #include "msp430_math.h"//usedfor 浮点计算#include
// P4 LCD 数据端口// P7.5 LCD 使能引脚// P7.4 LCD RS 引脚
#define cs_HIGH P3OUT |= BIT0;#define cs_low P3OUT &=~BIT0;#define sdo_high P3IN |= BIT3;#define sdo_low P3IN &=~BIT3;#define SDI_high P3OUT |= BIT1;#define SDI_LOW P3OUT &= BIT1;#define BIT2;=~~CLSDI_LLOW P3OUT 和= BIT1;= BIT1;#define P3OUT += BIT1;= BIT1;= BIT2_LK;= BIT1;= BITE_CLSDI_LK
//对于 EEPROM #define SDA_SET P7OUT |= BIT6;#define SDA_CLR P7OUT &=~BIT6;//I2C 例程# define SCL_SET P7OUT |= BIC7;#define SCL_CLR P7OUT &=~~BIC7;#define SDA_OUT P7DIR |= BIT6;#define SDA_IN P7DIR 和= BIT6;
#define RELAY_ON P2OUT |= BIT0;#define RELAY_OFF P2OUT &=~BIT0;//********* /********* /#define RS_SET P7OUT |= BIT4;#define RS_CLR P7OUT &=~BIT4;//LCD 控制引脚#define EN_SET P7OUT |= BIT4;#define EN_CLR P7OUT &=~BI.5;
/********* /
#define LTC_CLK_SET P6OUT |= BIT4;#define LTC_CLK_CLR P6OUT &=~BI.5;//LTC 1609 SPI interface#define LTC_RC_SET P6OUT |= BIT4;#define LTC_RC_CLR P6OUT &=~BIT4;
#define b_hRELAY_ON P6OUT |= BIT0;//电流范围更改继电器#define b_hRELAY_OFF P6OUT &=~BIT0;
#define I_hRELAY_ON P5OUT |= BIT2;//电流范围更改继电器#define I_hRELAY_OFF P5OUT &=~BIT2;
void clk();
void lcd_data (unsigned char x、unsigned char y、unsigned char z);void lcd_data_indication (unsigned char e1、unsigned char value2、unsigned char value3);void lcd_dat();void lcd_dat_welcome(;void lcd_page_3));void lcd_prate(;void lcd_prate_page3 ();void lid_yvoid void void lcd_prate();void lcd_pr
void dma();
void initiat_adc ();void write_adc (unsigned char);void read_adc (unsigned char);void off ();void convert ();void read_hv ();void cycle_count ();void frequency ();void find_rms ();
void LTC _read();// LTCvoid avere();// LTC
void switch_assign();void key_check();void key_14_m();void key_12_m();
//******* EEPROM 函数******** void start_i2c ();void write_i2c (unsigned char 数据);void read_i2c ();void end_i2c ();void no_ack ();void read_default ();void write_i2c_24bit (unsigned char Add1、unsigned char ADD2、unsigned char value24、unsigned char value8);unsigned char value8、unsigned char 8、unsigned char
// const unsigned int sample []={2048,219,233,2473,2612,2748,2880,3009,3133,3251,336,34,0356,366,3745,3821,388,3946,3995,4034,406,404,404,404,404,40964,409,403,394,336,336,396,336,336,336,3002,386,283,364,336,336,336,336,336,3004,364,364,362,336,3002,386,336,336,336,284,336,336,336,336,336,336,3004, 2748、2612、2473、232、190、2048190、1905、1763、162、1483、1347、1215、1086、962、844、731、625、52.6、436、350、274、207、149、61、100 149、207、274、274、275、350、434、52.6、625、 731,844,962,1086,1215,1347,1483,1622,176,1905};易失性无符号字符 adc,I2C_r0,mode_flag,rotate_cur,f4_SMPL,key,hld,z;volatile unsigned char adc24,adc16,adc8,c2,c3,c3,c3,c3,c3,c3,c3,c3,c3,c3,c1,key_flag,w,wvolature,f_temp,f_volatile、tature,tature_f,f_f1,tefin,tatureq,f_f_f,t,tefin,f_f_f_f_f_unsigned volatile、unsignatile、unsigned、unsigned chargeag,tatile、tefin,f_unsigned ch, tag,f_unsigned、f_unsigned、f_unsigned、f_unsigned chargeq_f_f_f_f_f_f_f_
void main(){ WDTCTL = WDTPW | WDTHOLD;//停止 WDT clk ();__DELAY_CYCLLES (200000);
P4DIR |= BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT4 | BIT6 | BIC7;// LCD 数据引脚 P7DIR |= BIT4 | BIT4;//LCD 控制引脚 P7DIR |= BIC7;//ADC 通信引脚 P7REN |= BIT6 ;= BIT6;= BIT2
LCD_cmd (0x38);//LCD 初始化__delay_cycles (10000);LCD_cmd (0x0c);__delay_cycles (10000);LCD_cmd (0x01); _delay_cycles (10000);LCD_cmd (0x81);__delay_cycles (10000);
LCD_Welcome ();__DELAY_CYCLES (20000000);LCD_cmd (0x01);__DELAY_CYCLES (10000);MODE_1 = 0x00; Z = 0;
while (1){start_i2c ();
WRITE_i2c (0xA0);//写入命令 WRITE_i2c (0x00);//地址 WRITE_i2c (0x00);//地址 WRITE_i2c (0x02);
end_i2c ();__delay_cycles (3000000);__delay_cycles (3000000);__delay_cycles (3000000);// read_i2c_8bit (0x00);start_i2c (); write_i2c (0xA0);write_i2c (0x00);write_i2c (0x00);start_i2c ();// write_i2c (0xA1);//读取命令// read_i2c ();end_i2c ();
// a = I2C_R0;bit_SEL_32 (3);LCD_cmd (0x80);__delay_cycles (10000);LCD_DATA (3、3、0); LCD_cmd (0xC0);__delay_cycles (10000);LCD_data1 (0x41);__delay_cycles (10000);z = z + 1;a = z;bit_SEL_32 (3);LCD_cmd (0x94);__delay_cycles (10000); LCD_DATA (3、3、0);}void read_default (){read_i2c_8bit (0x00、0x19);temp_1 = I2C_R0;read_i2c_8bit (0x00、0x1A);temp_2 = I2C_R0; READ_i2c_8位(0x00、0x1B);TEMP_3 = I2C_R0;BRQ =(65536U * TEMP_3)+(256U * TEMP_2)+ TEMP_1;
READ_i2c_8BIT (0x00、0x1C);TEMP_1 = I2C_R0;READ_i2c_8BIT (0x00、0x1D);TEMP_2 = I2C_R0;READ_i2C_8BIT (0x00、0x1E); temp_3 = I2C_R0;freq1 =(65536U * temp_3)+(256U * temp_2)+ temp_1;
READ_i2c_8位(0x00、0x20);TEMP_1 = I2C_R0;READ_i2c_8位(0x00、0x21);TEMP_2 = I2C_R0;READ_i2C_8位(0x00、0x22); temp_3 = I2C_R0;kgreq =(65536U * temp_3)+(256U * temp_2)+ temp_1;
READ_i2c_8位(0x00、0x23);TEMP_1 = I2C_R0;READ_i2c_8位(0x00、0x24);TEMP_2 = I2C_R0;READ_i2C_8位(0x00、0x25); temp_3 = I2C_R0;lengthreq =(65536U * temp_3)+(256U * temp_2)+ temp_1;
READ_i2c_8位(0x00、0x26);TEMP_1 = I2C_R0;READ_i2c_8位(0x00、0x27);TEMP_2 = I2C_R0;READ_i2C_8位(0x00、0x28); temp_3 = I2C_R0;densireq =(65536U * temp_3)+(256U * temp_2)+ temp_1;
READ_i2c_8位(0x00、0x29);TEMP_1 = I2C_R0;READ_i2c_8位(0x00、0x2A);TEMP_2 = I2C_R0;READ_i2C_8位(0x00、0x2B); temp_3 = I2C_R0;avg_smplreq =(65536U * temp_3)+(256U * temp_2)+ temp_1;}//******** EEPROM 写入******** void write_i2c_24bit (unsigned char Add1、unsigned char ADD2、unsigned char value24、unsigned char value16、unsigned char value8){start_i2c ();
write_i2c (0xA0);//写入命令 write_i2c (Add1);//地址 write_i2c (ADD2);//地址 write_i2c (value24);//数据 write_i2c (value16);write_i2c (value8);
end_i2c ();__delay_cycles (30000);}//******** EEPROM 读为******** void read_i2c_8bit (unsigned char ADD4){start_i2c ();//__delay_cycles (300000);write_i2c (0xA0);//__delay_cycles (300000);// write_i2c (add3);//__delay_cycles (300000);//(300000_delay);//(_id_iday_iday_iday_cles (300000);//(300000)/i000_iday_idr/(300000);// EEPROM 所有功能*********
void start_i2c (){
SDA_OUT;//SDA 作为输出
SDA_SET;SCL_SET;__DELAY_CYCLLES (2000);SDA_CLR;__DELAY_CYCLLES (2000); SCL_CLR;__delay_cycles (2000);}void write_i2c (unsigned char data){unsigned char I2C_count;unsigned char I2C_data;SDA_out;//SDA as output
I2C_DATA =数据;
对于(I2C_COUNT = 0;I2C_COUNT < 8;I2C_COUNT++){if (I2C_DATA & 0x80){SDA_set;__DELAY_CYCLRLES (1000);}else{SDA_CLR;__DELAY_CYCLLES (1000);}SCL_SET;//CLK SET __DELAY_CYCLRLES (1000);SCL_CLR; //CLK 清除__delay_cycles (500);I2C_DATA <<= 1;
}
ACK();}
void read_i2c (){unsigned char I2C_count;unsigned char I2C_acc;
SDA_IN;SDA_SET;SCL_CLR;__DELAY_CYCLLES (400);I2C_ACC = 0x00; I2C_R0 = 0x00;对于(I2C_COUNT = 0;I2C_COUNT < 7;I2C_COUNT++) {SCL_SET;//CLK SET __DELAY_CYCLLES (2000);
if (P7IN & BIT6){I2C_ACC |= BIT0;}否则{I2C_ACC &=~BIT0;}
I2C_ACC = I2C_ACC << 1; SCL_CLR;//CLK CLEAR __DELAY_CYCLESS(2000); }SCL_SET;//CLK SET __DELAY_CYCLESS(2000);
if (P7IN & BIT6){I2C_ACC |= BIT0;}否则{I2C_ACC &=~BIT0;}
SCL_CLR;//CLK 清除__DELAY_CYCLLES (2000);
I2C_R0=I2C_ACC;NO_ACK ();
}
void end_i2c (){
SDA_CLR;//__延迟_周期(500);SCL_SET;_延迟_周期(4000);SDA_SET;//_延迟_周期(4000);SCL_CLR; _DELAY_CYCLES (4000);}
void ack(){SDA_IN;
// while (P3IN & BIT6);
SCL_SET;__delay_cycles (4000);
SCL_CLR;__delay_cycles (2000);
SDA_OUT;}void no_ack (){SDA_OUT;__delay_cycles (400);SDA_set;
SCL_SET;__DELAY_CYCLLES (4000);SCL_CLR;
__DELAY_CYCLES (4000);}//********
void lcd_welcome(){ lcd_cmd (0x80);__delay_cycles (100);lcd_daa("---------- ----");
lcd_cmd (0xC0);__delay_cycles (100);lcd_dataaa (" veer electronics ");
lcd_cmd (0x94);__delay_cycles (100);lcd_dataa (" Epstein 测试 仪");
lcd_cmd (0xd4);__delay_cycles (100);lcd_dataa ("------- ----");}void LCD_data1 (unsigned char disp) //用于在 LCD 上发送数据的函数{P4OUT = disp;RS_set;//RS EN_set;//en __delay_cycles (5000);EN_CLR;}
LCD_dataaa (unsigned char * disp) //用于将字符串发送到 LCD 的函数{int x;for (x=0;disp[x]!=0;x++){LCD_data1 (disp[x]);}
//********* 液晶屏******** void lcd_cmd (unsigned char 命令){__delay_cycles (8000);
P4OUT =命令;RS_CLR;EN_SET;__DELAY_CYCLLES (5000);
en_clr;//返回;}void bit_sep_32 (unsigned char c){unsigned char w;// d[10]= 0;for (w=1;w<=c;w++){h=A/10;d[w]=a%10;d[w]=d[w]+0x30;a=h/10; W++;d[w]=h%10;d[w]=d[w]+0x30;
//__delay_cycles (1000);}//返回;}
void lcd_data_indication (unsigned char value1、unsigned char value2、unsigned char value3){P4OUT = value1;lcd_dat ();
P4OUT = value2;lcd_dat ();
P4OUT = value3;LCD_dat();
// return;}void lcd_dat (){rs_set;//rs EN_set;//en __delay_cycles (5000);EN_CLR;}void lcd_data (unsigned char x、unsigned char y、unsigned char z){unsigned char w;
for (w=x;w>y;w-){P4OUT = d[w];rs_set;//rs EN_set;//en __delay_cycles (5000);EN_CLR;}
P4OUT ='.';RS_SET;//RS EN_SET;//en __DELAY_CYCLS (5000);EN_CLR;
for (w=y;w>z;w-){P4OUT = d[w];rs_set;//rs EN_set;//en _ delay_cycles (5000);EN_CLR;}
void clk (){P7SEL |= BIT2 + BIT3; //端口选择 XT2P3DIR |= BIT4; // SMCLK 设置为 pinsP3SEL |= BIT4;
UCSCTL6 &=~XT2OFF; //启用 XT2UCSCTL3 |= SELREF_5; // FLLref = REFO
UCSCTL4 |= SELA_2; //这里我们可以控制 MCU 的 clk (对于 ACLK 为+DIVA_2)//循环直到 XT1、XT2和 DCO ~;//在这里我们可以控制 MCU 的 clk (对于 ACLK 为+DIVA_2)//循环直到 XT1、XT2和 DCOL (在 XFFG + XFFG 中为+DFFG);在 XFFT + XFFG + XFF2 ~+ XFFG (在 XFFT 中为 FFG + XCOL FFG + FFG = FFT + XFFT + XCOL FFG = FFG = FFG + D0 //清除故障标志}while (SFRIFG1&OFIFG);//测试振荡器故障标志
UCSCTL4 |= SELS_5+SELM_5;// SMCLK=MCLK=XT2 SELM_5
_DELAY_CYCLS (1000);// UCSCTL5 |= DIVS__4;// SMCLK 除以4// UCSCTL5 |= DIVM_2; //如果执行此操作,工作正常
}//******* 额外子例程 ******** /*void key_1_to9_m (){if (mode_1 = 1){key_1to9 ();rotate_cursor ();br = value;ds_bm ();return;} 否则、如果(mode_1 == 2){key_1to9 ();rotate_cursor ();freq = value;ds_freq ();return;} 否则、如果(mode_1 == 3){key_1to9 ();rotate_cursor ();kg = value;ds_kg();return;} 否则、如果(mode_1 == 4){key_1to9 ();rotate_cursor ();length = value;ds_length ();return;} 否则、如果(mode_1 == 5){key_1to9 ();rotate_cursor ();density = value;ds_density ();return;} 否则、如果(mode_1 == 6){key_1to9 ();rotate_cursor ();avg_SMPL = value;dis_sampl();return;} else{// switch_assign ();// return;}void key_1_9 (){if (swich & BIT0)//1{key = 0x01;// return;}else if (swich & BIT1)//2{key = 0x02;// return;}else if (swich & BIT2)// return;//(swich & BIT4)= 0x04;// key = 0x04;// return;/(b/)= 0x04;/(bit4);/ key = 0x04;//(b/(b/) 否则 if (swich & BIT5)//6{key = 0x05;// return;}else if (swich & BIT6)//7{key = 0x06;// return;}else if (swich & 0x0100)//9{key = 0x07;// return;}else if (swich & 0x0200)// return;}//关键字= 0x08;//返回 否则 if (swich & 0x0400)//11{键= 0x09;//返回;}否则 if (swich & 0x4000)//15{键= 0x00;//返回;}*/