MSP430F249硬件I2C查询法读写AT24C02

发布者:纯真年代最新更新时间:2017-11-25 来源: eefocus关键字:MSP430F249  硬件I2C  查询法  读写AT24C02 手机看文章 扫描二维码
随时随地手机看文章


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

**                                                       
**  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]);
      UartSend(PRxData[2]);
      UartSend(PRxData[3]);
      


  }
}


关键字:MSP430F249  硬件I2C  查询法  读写AT24C02 引用地址:MSP430F249硬件I2C查询法读写AT24C02

上一篇:IIC协议及其对ACK应答信号的处理
下一篇:MSP430F249_TimerA定时器

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

STM8S103硬件I2C的操作注意事项
1. STM8的SCL和SDA这两个引脚标注了T,即纯开漏引脚。纯开漏引脚输0时为低,输出1为高阻态,而不是高电平。所以,这两个脚需要加上拉电阻。 2. SCL设置为OUTPUT没有毛病,SDA在STM8作为主机读取从机数据时要设置为输入、作为主机向从机写数据时要设置为输出,这里PB_CR1就要设置为0(输出时为开漏,输入时为浮空)。SDA作为输出时,其输出的速率被限定在 O1= slow(up to 2MHz),所以PB_CR2的对应 bit 就没有必要设置为1(output时),另外设置为1时(且SDA引脚为input时)会否触发中断?(初步思考:应该不会吧,都I2C了,不是GPIO) 3.寄存器I2C_CR2中的 b
[单片机]
硬件I2C驱动MPU6050
I2C I2C有两条总线线路,分别是SCL(时钟线)和SDA(数据线)。 I2C的时序非常重要:读数据和写数据的时序有点不一样,在写程序的时候就体现得到。 I2C的SCL高电平时有效,SDA高电平为1,低电平为0。 I2C的驱动: I2C.h #ifndef __I2c__H #define __I2c__H #include stm32f4xx.h #define MPU_ADDRESS 0xd0 #define I2C_SCL_CLK RCC_AHB1Periph_GPIOB #define I2C_SDA_CLK RCC_AHB1Periph_GPIOB #define MPU_I2C
[单片机]
<font color='red'>硬件</font><font color='red'>I2C</font>驱动MPU6050
TQ210裸机编程(3)——按键(查询
首先查看TQ210的底板原理图 这次编程只操作KEY1和KEY2,在TQ210核心板原理图中搜索XEINT0 可以看出KEY1和KEY2分别接在S5PV210的GPH0_0和GPH0_1引脚。 这次编程使用查询法,需要设置这两个引脚为输入模式,然后循环读取引脚状态,当用户按下按键时,对应引脚为低电平,同时改变LED状态。 查看S5PV210芯片手册 start.S .global _start @声明一个全局的标号 _start: bl main @跳转到C函数去执行 halt: b halt @死循环 key.c #define GPC0CON *((volatile unsigne
[单片机]
TQ210裸机编程(3)——按键(<font color='red'>查询</font><font color='red'>法</font>)
MSP430F249----IIC
/****************************************************************** ** ** File : IIC.c | IIC Communication | ** Version : 1.0 ** Description : 430 WRITE AND READ 24C02 VIA IIC BUS ** Author : LightWu ** Date : 2013-4-11
[单片机]
STM32硬件i2c的EV卡死问题的终极解决(已通过老化测试40h)
鉴于各位对于stm32的硬件i2c均存在质疑且在此处下载的所有硬件i2c程序均基于一个模板 大家对于硬件i2c的说法均在初始化上而对于发送接收程序并没有多少改动 所以我个人对这一段进行了优化,加上了超时自动跳出和标志位的动作,完美解决了硬件i2c的卡死问题 这里就是一个初始化的程序,应注意,clockspeed不应该高于100k 这是一个初始化的顺序,应注意,i2c的初始化应在RCC和GPIO之后进行 上面这一段就是新增的程序模块,为的是对于易卡死的while循环做出限制,防止死循环。 只需将已有的程序中所有的关于硬件i2c的while循环均加上这一条就可以使用了。 此处如果在I2C1_hardware_wait_ci
[单片机]
STM32<font color='red'>硬件</font><font color='red'>i2c</font>的EV卡死问题的终极解决(已通过老化测试40h)
STM32 I2C硬件
1,该模块默认地工作于从模式。接口在生成起始条件后自动地从从模式切换到主模式;当仲裁丢失或产生停止信号时,则从主模式切换到从模式。 2,数据和地址按8位/字节进行传输,高位在前。 3,数据流:SDA线- 移位寄存器- DR寄存器 主模式 以起始条件开始并以停止条件结束。当通过START位在总线上产生了起始条件,设备就进入了主模式。 1、检测总线状态,当总线空闲时(I2C_SR2的BUSY=0)。 FlagStatus I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY); 2、设置START=1,产生起始信号。 I2C_ GenerateSTART 起始信号产生后,I2C_SR1的SB位被硬件置
[单片机]
stm32硬件I2C测试例程,亲测可用
对于stm32的硬件I2C确实有不尽人意的地方。但是还是可以实现的,毕竟使用stm32的硬件I2C确实比使用IO口来模拟简单的多。下面的程序代码是使用stm32F03ZET6的I2C1(PB6,PB7)和AT24C02的EEPROM来测试的。希望对于需要的朋友有帮助。 i2c.c #include iic.h #include stm32f10x.h #include usart.h u16 timeout=TIMEOUT; /*i2c的初始化*/ void IIC1_Init() { GPIO_InitTypeDef GPIO_InitStruct; I2C_InitTypeDef I2C_InitStr
[单片机]
关于STM32的I2C硬件DMA实现
简介:网上看到很多说STM32的I2C很难用,但我觉得还是理解上的问题,STM32的I2C确实很复杂,但只要基础牢靠,并没有想象中的那么困难。 那么就先从基础说起,只说关键点,不涉及代码。 首先说I2C这个协议:协议包括START、ACK、NACK、STOP。尽管协议中规定START必须,其他几个非必须,但实际上其他三个仍旧非常重要。 主发从收:主 START - 主发地址 - 从 ACK - (主发数据 - 从 ACK (循环)) - 主 STOP 或 主 START 启动下一次传输 这一过程中,主控SCL线,从只在ACK时控SDA线,其他时刻主控SDA线。 主收从发:主 START - 从发地址 - 主 A
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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