历史上的今天
返回首页

历史上的今天

今天是:2025年01月14日(星期二)

正在发生

2021年01月14日 | MSP430F249----IIC

2021-01-14 来源:eefocus

/******************************************************************
**                                                       
**  File : IIC.c     | IIC Communication |                                    
**  Version : 1.0     
**  Description : 430 WRITE AND READ 24C02  VIA IIC BUS                                                                     
**  Author : LightWu                              
**  Date : 2013-4-11                                                       
**                                                   
*******************************************************************/

#include


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


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


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


}


int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P3SEL |= 0x06;                            // Assign I2C pins to USCI_B0
  
  IICInit();
  
  UartInit();


  while (1)
  {
      UartSend('A');
      
      PTxData[0] = 1;
      PTxData[1] = 'M';
      PTxData[2] = 3;
      PTxData[3] = 4;
      PTxData[4] = 5;
      pTail = 2;
      
      IICSend();
        
      UartSend('B');
      
      //
      
      pHeadR = 0; 
      pTailR = 3;
      IICRecv();
      
      UartSend(RxData[0]);
      UartSend(RxData[1]);
      UartSend(RxData[2]);
      
      while(1);


  }
}


//------------------------------------------------------------------------------
// The USCIAB0TX_ISR is structured such that it can be used to transmit any
// number of bytes by pre-loading TXByteCtr with the byte count. Also, TXData
// points to the next byte to transmit.
//------------------------------------------------------------------------------
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
  if ( pHead < pTail )                            // Check TX byte counter
  {


      UCB0TXBUF = PTxData [pHead++ ];                 // Load TX buffer
        
  }
  else
  {
     pHead = 0; 
      
   // UCB0CTL1 |= UCTXSTP;                    // I2C stop condition,if write finish
    IFG2 &= ~UCB0TXIFG;                     // Clear USCI_B0 TX int flag
    __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
  
  }
}


#pragma vector = USCIAB0RX_VECTOR
__interrupt void USCIAB0RX_ISR(void)
{
    
  if ( pHeadR < pTailR )                            // Check TX byte counter
  {


      RxData[ pHeadR++ ] = UCB0RXBUF;                   // Move RX data to address PRxData
  
  }
  else
  {  
      pHeadR = 0; 
      
      UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
      IFG2 &= ~UCB0RXIFG;                     // Clear USCI_B0 RX int flag
      __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
      
  }


}


推荐阅读

史海拾趣

EPCOS/TDK公司的发展小趣事

作为全球领先的电子元器件制造商之一,EPCOS在通信领域取得了显著的突破。其电容器、电感器等产品在通信系统中发挥着关键作用,为各种通信设备提供了稳定的电源和信号处理方案。EPCOS不断投入研发资源,致力于开发适应新一代通信技术需求的高性能电子元器件。这些创新产品不仅提高了通信系统的性能和可靠性,也推动了整个通信行业的进步。

以上是关于EPCOS/TDK公司发展起来的5个相关故事。这些故事不仅展示了公司在技术创新、市场拓展等方面的成就,也体现了其在电子行业中的重要地位和影响力。

创世(CS)公司的发展小趣事

在电子行业中,品质控制和质量管理是企业生存和发展的关键。创世公司深知这一点,始终将品质放在首位。公司建立了严格的质量管理体系,从原材料采购到生产制造、产品检测等各个环节都严格把控品质。同时,创世公司还引进了先进的生产设备和检测仪器,确保产品的可靠性和稳定性。这种对品质的执着追求使得创世公司的产品在市场上获得了良好的口碑和广泛的认可。

复旦微电子(FM)公司的发展小趣事

创世公司在SD NAND存储产品的研发过程中,不断突破技术壁垒,实现了产品的创新。例如,2018年,为满足轨道交通、航空航天、工业控制等行业类客户对存储产品的特殊需求,创世公司首家推出了第二代SD NAND产品。这一产品不仅具有更快的读写速度和更宽泛的使用环境,还能承受高低温冷热冲击、随机掉电等苛刻的操作环境。同时,创世公司还为客户提供个性化的固件定制服务,进一步满足了客户的个性化需求。

DMC Tools公司的发展小趣事

在发展过程中,DMC Tools公司积极寻求国际合作,与多家国际知名电子企业建立了长期稳定的合作关系。通过与这些企业的合作,DMC Tools公司不仅学习到了先进的生产技术和管理经验,还拓宽了自己的市场视野。这些国际合作项目为公司带来了大量的订单和利润,同时也提升了公司的国际竞争力。

Glenair公司的发展小趣事
电路中的连接线可能松动、接触不良或断裂,导致信号无法正确传输。
Horizon Electronics Enterprises Group公司的发展小趣事

为了应对市场需求的多样化和技术发展的快速变化,Horizon开始实施多元化产品布局战略。公司不仅继续深耕半导体芯片领域,还逐步拓展至电子元器件、智能设备、物联网解决方案等多个领域。通过自主研发和合作并购等方式,Horizon不断丰富产品线,满足不同客户的多样化需求。这一战略的实施不仅增强了公司的市场竞争力,也为公司的持续发展注入了新的动力。

问答坊 | AI 解惑

WINCE的项目中,能引用System.timers吗?

我在C#程序中想添加个计时器:                 System.Timers.Timer aTimer = new System.Timers.Timer();                 aTimer.Elap ...…

查看全部问答>

请高手支招,寻找MAX323EPE的替换芯片

感谢您进来,祝您身体健康,财源滚滚! 我现在有一个硬件用的芯片是MAX323EPE,但是不支持VISTA和WIN7,有没有一种芯片能替换的,非常感谢。…

查看全部问答>

wince界面设计问题

请问要设计出这样的界面需要使用什么软件? 这种界面设计使用的什么方法。都是贴的图吗? 那具体设计过程是怎么样的? 好像是先设计整个界面,然后在截图。 …

查看全部问答>

在WINCE60里面把CELLCORE组件加进了NK,怎么测试这块是不是可以正常工作?有没简单的测试AP可用?怎么测试RIL组件绑定了物理通信的串口?

在WINCE60里面把CELLCORE组件加进了NK,怎么测试这块是不是可以正常工作?有没简单的测试AP可用?怎么测试RIL组件绑定了物理通信的串口?…

查看全部问答>

系统是怎么调用PS2驱动的入口函数的?

最近在做一个在JZ上的PS2驱动,因为是第一次做驱动,所以不清楚具体是怎样掉用这个驱动的入口函数的?请各位大大帮帮忙,有帮忙的都有10分,不够我再加…

查看全部问答>

ppc2003可以直接访问sql2000 server中的数据吗?

ppc2003通过wifi跟局域网连接后,可以通过编程直接访问服务器上sql2000 server中的数据吗?有人说必须在ppc上安装sql CE,然后通过sql CE跟服务器上的sql2000交换数据?真的是这样?…

查看全部问答>

vworks中多任务的实现能否以多个文件中发起

因设计的模块较多,在有的模块中有任务发起。有的模块中仅有函数调用,在vxSIM调试时,不能顺利进行下去。有人能批点一下不? 另外,在一个文件中发起任务,在另一个文件中实现任务,可以不? 在任务中再发起子任务可以这样设计吗?…

查看全部问答>

立即报名预约2010吉时利新能源与新材料测试技术研讨会

2010年度吉时利测试测量技术全国巡回研讨会将从9月初开始,在成都、重庆、合肥、南京、哈尔滨、武汉、兰州举办届时吉时利资深技术专家将与您深入交流: 绿色电子革命中的光电测试/新能源测试方案 新材料的测试方案 微弱信号测量难点与应对方 ...…

查看全部问答>

uCADCDMA通道4中断问题!

使用uC2.86   ADC使用DMA中断的模式,在DMA1_CH1 初始化以及 中断 都没问题,都可以进中断, 但是改成 DMA1_CH4 就再也不进中断了,为什么?? 难道 DR_ADDRESS 地址不对?? RCC,等其他设置应该都没问题请大家看下我的初始化函 ...…

查看全部问答>

问高手一个关于STM8 I2C的问题

最近在调STM8 的I2C(不想搞模拟的I2C),结果I2C没有调通,不知道问题所在,软件是参考I2C EEPROM固件那个程序写的。初始化如下: void IIC_Init(void) { UCHAR temp; CLK_PCKENR1 |= 0x01; I2C_CR1    = 0x00;  &n ...…

查看全部问答>