历史上的今天
今天是:2025年02月05日(星期三)
2020年02月05日 | MSP430F249EEprom读写
2020-02-05 来源:eefocus
/******************************************************************
**
** File : EEPROM.c | Eeprom write and read |
** Version : 1.0
** Description : Eeprom write and read
** Author : LightWu
** Date : 2013-4-15
**
*******************************************************************/
#include //注意:两次发送间隔必须要有延时,否则不能再次发送,串口发送格式: unsigned char PTxData[250]; // Pointer to TX data unsigned char pHeadT; unsigned char pTailT; unsigned char pHeadR; unsigned char pTailR; unsigned char TXByteCtr; const unsigned char TxData[] = // Table of data to transmit { 0x01, 0x02, 0x03, 0x04, 0x05 }; unsigned char RxData[] ; void UartInit(void) { if (CALBC1_1MHZ==0xFF) // If calibration constant erased { while(1); // do not load, trap CPU!! } DCOCTL = 0; // Select lowest DCOx and MODx settings BCSCTL1 = CALBC1_1MHZ; // Set DCO DCOCTL = CALDCO_1MHZ; P3SEL |= 0x30; // P3.4,5 = USCI_A0 TXD/RXD UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 104; // 1MHz 9600; (104)decimal = 0x068h UCA0BR1 = 0; // 1MHz 9600 UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1 UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** } void UartSend( unsigned char Data ) { UCA0TXBUF = Data; // TX -> RXed character while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?,发送缓冲区空 } void IICInit(void) { UCB0CTL1 |= UCSWRST; // Enable SW reset UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz UCB0BR1 = 0; UCB0I2CSA = 0xA0>>1; // Slave Address is ,注意地址需要右移一位,24C02地址为0XA0,故要写入0X50 // 7位地址模式,器件会发送一位读写位,正好8位。 UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation IE2 |= UCB0TXIE; // Enable TX interrupt IE2 |= UCB0RXIE; } void IICSend( void ) { int i; for(i=3000;i>0;i--); //两次发送间隔必须要有延时,否则不能再次发送 while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts } void IICRecv( void ) { int i; for(i=3000;i>0;i--); //两次发送间隔必须要有延时,否则不能再次发送 while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent UCB0CTL1 &= ~UCTR; UCB0CTL1 |= UCTXSTT; __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts } //写入一个字节数据 void EepromWrite( unsigned char Addr, unsigned char Data ) { int i; pHeadT = 0; pTailT = 2; //一个地址,一个数据 PTxData[0] = Addr; PTxData[1] = Data; for(i=3000;i>0;i--); //两次发送间隔必须要有延时,否则不能再次发送 while (UCB0STAT & UCBUSY); // wait until I2C module has // finished all operations. while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts //进入低功耗状态 while( pHeadT < pTailT ); //等待直到发送完成 pHeadT = 0; //清零 UCB0CTL1 |= UCTXSTP; // I2C stop condition,产生终止信号 while(UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent } //读N个字节数据 unsigned char EepromRead( unsigned char Addr , unsigned char Num ) { int i; pHeadT = 0; pTailT = 1; //写入1个地址 pHeadR = 0; pTailR = Num; //读取个数 PTxData[0] = Addr; for(i=3000;i>0;i--); //两次发送间隔必须要有延时,否则不能再次发送 while (UCB0STAT & UCBUSY); // wait until I2C module has // finished all operations. while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts //进入低功耗状态 //设置为读取接收 for(i=3000;i>0;i--); //两次发送间隔必须要有延时,否则不能再次发送 UCB0CTL1 &= ~UCTR; UCB0CTL1 |= UCTXSTT; //start Read __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts return 1; } int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P3SEL |= 0x06; // Assign I2C pins to USCI_B0 IICInit(); UartInit(); while (1) { UartSend('M'); EepromWrite(0x13,'A'); EepromWrite(0x11,'B'); EepromWrite(0x12,'C');
史海拾趣
|
gy8u一上来就希望:大家多交流技术的话题, 非常欢迎gy8u版主,非常欢迎大家讨论:比如数据采集…… gy8u版主其人:主要做的工作是做汽车电子的测试,以及整车的测试……… 查看全部问答> |
|
晶振频率11.0592MHZ 源程序如下: 问题是 利用串口调试软件运行时,反复输入U后经采样转换数据不一致,即模拟信号转成数字量的值 跳变太大。。。请教专家!!! CS BIT P1.1 &n ...… 查看全部问答> |
|
我用的Sensor是200万的,芯片输出为1600×1200,而我在应用层只采取了 1600×1130,我不确定是不是这样引起图像不同步的原因,还是别的什么原因。 … 查看全部问答> |
|
本人是计算机专业的。由于现在快踏入大三的下学期了,大四下学期也就要找工作了,但我觉得现在自己学的东西还太片面了,也太广了。所以我想找一门自己感兴趣的专业方向作为自己这未来一年的奋斗目标,同时也为了将来的工作需要同,学一门精的课程。 ...… 查看全部问答> |
|
STM32具有12BIT ADC 确实很好,很强大!但也担心它的精度问题,听闻有3BIT线形误差。下面是AT91SAM7S64关于ADC误差的说明。… 查看全部问答> |
|
http://www.stmsky.com/bbs/viewthread.php?tid=1446&extra=网络版原理图==stm32核心板+w5100模块可以直接联网 ping 192.168.1.2直接打开 显示 hello world… 查看全部问答> |




