历史上的今天
返回首页

历史上的今天

今天是:2025年06月17日(星期二)

正在发生

2020年06月17日 | MSP430F249硬件I2C查询法读写AT24C02

2020-06-17 来源:eefocus

/******************************************************************


**                                                       

**  File : I2C.c     | Master Read Write |                                    

**  Version : 1.0     

** Description : I2C 查询法读写24C02                                                                    

**  Author : LightWu                              

**  Date : 2013-4-26                                                       

**  必须注意多字节数据读取时,发送停止位需要在最后一个字节读取之前

**  否则数据读取后,停止位发送容易失败,导致从机接收不到停止位。                                                 

*******************************************************************/



#include



//注意:两次发送间隔必须要有延时,否则不能再次发送,串口发送格式:



unsigned char PTxData[250];                     // Pointer to TX data

unsigned char PRxData[250];                     // Pointer to RX data





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

  

}



/*******************************************

函数名称:Ucb0I2c_Start(void)

功    能:I2C主机模式,发送写起始条件

参    数:无

         

返回值  :无

********************************************/

void Ucb0I2c_Start(void)

{

   UCB0I2CSA = 0x50;                      // Slave Address is 0xd0

   while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent

   UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition

   while(!(IFG2&UCB0TXIFG));                  //等待传送完

   IFG2 &= ~UCB0TXIFG;                     // Clear USCI_B0 TX int flag

}

void IICSendData( unsigned char Addr ,unsigned char Data )

{

    int i;

     for(i=3000;i>0;i--);                   //两次发送间隔必须要有延时,否则不能再次发送



   Ucb0I2c_Start();

    

   UCB0TXBUF = Addr;                     // Load TX buffer

   while(!(IFG2&UCB0TXIFG));                  //等待传送完成

   IFG2 &= ~UCB0TXIFG;                     // Clear USCI_B0 TX int flag

      

   UCB0TXBUF = Data;                     // Load TX buffer

   while(!(IFG2&UCB0TXIFG));                  //等待传送完成

   IFG2 &= ~UCB0TXIFG;                     // Clear USCI_B0 TX int flag

    

    UCB0CTL1 |= UCTXSTP;                    // I2C stop condition

   

}



void IICReadData( unsigned char Addr )

{

    int i;

     for(i=3000;i>0;i--);                   //两次发送间隔必须要有延时,否则不能再次发送

    

    Ucb0I2c_Start();

    

    UCB0TXBUF = Addr;                     // Load TX buffer

   while(!(IFG2&UCB0TXIFG));                  //等待传送完成

   IFG2 &= ~UCB0TXIFG;                     // Clear USCI_B0 TX int flag

     

    UCB0CTL1 &= ~UCTR ;              // I2C RX, Read

    UCB0CTL1 |= UCTXSTT;             // I2C RX, start condition

    

    while(!(IFG2&UCB0RXIFG));                  //等待接收完成

      IFG2&=~UCB0RXIFG;

    PRxData[0] = UCB0RXBUF;                 // Read RX buffer

   while(!(IFG2&UCB0RXIFG));                  //等待接收完成

     IFG2&=~UCB0RXIFG;                  

    PRxData[1] = UCB0RXBUF;                 // Read RX buffer

   while(!(IFG2&UCB0RXIFG));                  //等待接收完成

     IFG2&=~UCB0RXIFG;                  

    PRxData[2] = UCB0RXBUF;                 // Read RX buffer

   while(!(IFG2&UCB0RXIFG));                  //等待接收完成

       IFG2&=~UCB0RXIFG;                  

    

   //必须注意发送停止位在最后一个字节读取之前

     UCB0CTL1 |= UCTXSTP;                    // I2C stop condition

 

     PRxData[3] = UCB0RXBUF;                 // Read RX buffer

}

int main(void)

{

    

  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  P3SEL |= 0x06;                            // Assign I2C pins to USCI_B0

  

  IICInit();

  

  UartInit();



  while (1)

  {

      UartSend('M');

      

      IICSendData(0X00,'A');

       IICSendData(0X01,'B');

        IICSendData(0X02,'C');

         IICSendData(0X03,'D');

          IICSendData(0X04,'E');

           IICSendData(0X05,'F');

            IICSendData(0X06,'H');

             IICSendData(0X07,'J');

      



      IICReadData(0x00);

      UartSend(PRxData[0]);

      UartSend(PRxData[1]);

推荐阅读

史海拾趣

珠海艾派克(APEXMIC)公司的发展小趣事

成立于2004年的珠海艾派克微电子有限公司,在创业初期便致力于集成电路芯片设计领域的探索。公司凭借着对CPU设计技术、多核SoC专用芯片设计技术、安全芯片设计技术等核心技术的深入研究,逐步在行业内积累了良好的口碑。这一时期,艾派克坚持以市场需求为导向,不断优化产品性能,为公司的长远发展奠定了坚实的基础。

承兴(CX)公司的发展小趣事

经过多年的努力和发展,承兴公司已经成为一家具有全球影响力的电子企业。除了在中国市场保持领先地位外,承兴还积极拓展海外市场,并在美国、新加坡等地设立了分公司和研发中心。通过与全球合作伙伴的紧密合作和资源共享,承兴不断提升其全球竞争力,并努力实现国际化的发展目标。

请注意,由于承兴(CX)公司的具体发展历程和细节可能因时间和市场变化而有所不同,以上故事仅为虚构示例,旨在展示承兴公司在电子行业中的发展脉络和关键事件。

A/D Electronics Inc公司的发展小趣事

A/D Electronics Inc在创立初期,以其卓越的技术研发团队在模拟到数字转换器(ADC)领域取得了重大突破。公司研发出一款高精度、低噪声的ADC芯片,这一创新产品迅速在市场中获得认可,为公司的初步发展奠定了坚实基础。随着技术的不断迭代,A/D Electronics Inc陆续推出了一系列高性能的电子产品,满足了市场对于高效、稳定电子元件的日益增长需求。

Cembre SPA公司的发展小趣事

Cembre SPA的创始人,以其对电子行业的深刻理解和远见,于XXXX年创立了这家公司。在初创期,他看到了电气连接和固定技术在工业领域中的巨大潜力,并决定专注于此。公司最初的产品线集中在电缆接头和固定设备上,这些产品以其高质量和易用性迅速获得了市场的认可。

EFINIX公司的发展小趣事

为了加速Quantum™可编程加速器技术的商业化进程,EFINIX公司与中芯国际集成电路制造有限公司展开合作。中芯国际是世界领先的集成电路晶圆代工企业之一,其先进的制造能力为EFINIX公司提供了强有力的支持。双方合作仅用了不到六个月的时间,就成功交付了首批Quantum™可编程加速器产品样本,创造了行业内的里程碑。

顺芯(Everest-semi)公司的发展小趣事

近年来,随着5G、物联网等技术的快速发展,电子行业面临着巨大的变革。顺芯公司及时调整战略方向,加大在5G通信芯片、物联网安全芯片等领域的研发力度。同时,公司还积极探索新的商业模式和市场机会,如与汽车制造商合作开发车载芯片等。这些举措使顺芯公司在行业变革中保持了竞争优势。

问答坊 | AI 解惑

2009年竞赛登记表.doc

本帖最后由 paulhyde 于 2014-9-15 08:57 编辑 2009年竞赛登记表.doc  …

查看全部问答>

电子大赛历届题目方案分析及讲解

本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 电子大赛历届题目方案分析及讲解,分析的很具体!  …

查看全部问答>

周末,大家都干啥去了?

周末,除了陪家人外,我还上网啊!上来一发现,来逛坛子的人好少啊!…

查看全部问答>

家庭电子小制作

中文名称:家庭电子小制作 版本:高清晰PDF图片电子图书 发行时间:2004年 地区:大陆 语言:普通话 编辑、剪辑:方大千 基本信息·出版社:新时代出版社 ·ISBN:7504208876 ·条码:9787504208873 ·版次:1 ·装帧:平装 ------------ ...…

查看全部问答>

SPI接口的8686无线网卡,俩问题,请教各位大哥大姐

我用的岭仪电子的8686WIFI(09) 驱动是该公司提供的 接口SPI 现在的问题是我可以读到ID,可以正常启动连网界面,但是目前发现,第一次不能连接上外网, 如果是自动分配IP则得到一个无效IP,手动分配也不能连上网络 解决方法:必须重新启动WIF ...…

查看全部问答>

我在wince的应用程序里调用nandflash的驱动,但是nandflash驱动却调用不到FMD_OEMIoControl,有朋友能指点一下吗?

我在wince的应用程序里调用nandflash的驱动,但是nandflash驱动却调用不到FMD_OEMIoControl。 我用CreateFile来取得的nandflash驱动句柄,并且该句柄不为空。然后调用DeviceIoControl,总是返回失败,GetLastError返回的错误代码是87,参数错误的 ...…

查看全部问答>

刚回来的EVM板,编译自带例程时总提示bios版本不兼容怎么回事啊??

大侠指教啊~~ 具体如下: \\\"c:\\\\ti\\\\plugins\\\\bios\\\\gconfgen\\\" led.cdb \\\"led.cdb\\\", line 1: error: Version 4.90.270 is not compatible with this version of BIOS. Please open this file in the Configuration Tool ...…

查看全部问答>

【求助】关于149的串口问题(就快疯了,大家请帮忙啊)

最近在调试F149的串口,快郁闷的不行了! 系统:F149 串口1,通信芯片MAX3485 收发数据均为查讯方式 9600Bps 工具:串口调试器 测试方式1:不停的向串口调试器发送数据,收到的数据没问题! 测试方式2:先向串口调试器发送数据,然后串口调试 ...…

查看全部问答>

关于msp430的问题——求助各位大牛(急)

用msp430怎么使用32位的long型的数呢,我用了一下,貌似还是超不过65536?难道不支持32位的整数吗?假如我得表示一个大于65536的数该怎么办呢?…

查看全部问答>

嵌入式ARM9-2440实验手册

广嵌的 嵌入式ARM9-2440实验手册…

查看全部问答>