⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c_hard.c

📁 程序是在IAR上调试的
💻 C
字号:
//         MSP430x16x 硬件I2C 模块
//********************************************
//特征说明:   CPU = msp430f169               *
//  CLOCK :   XT2 = 8M   XT1 = 32.768K       *
//********************************************

#include <msp430x16x.h>
#include "I2C_hard.h"


//初始化I2C模块
//
void I2C_Init()
{
   P3SEL |= 0x0a; //Assign I2C pins to module
   P3DIR &= ~0x0A;//确保IIC总线的初始化
   U0CTL |= I2C + SYNC; //Switch USART0 to I2C mode
   U0CTL &= ~I2CEN; //Recommended I2C init procedure
 
   I2CTCTL |= I2CSSEL_2; //SMCLK ,8m
   //I2CPSC |= 0x05; //分频,时钟源供给I2C模块
   I2CSCLH = 0x19; //High period of SCL
   I2CSCLL = 0x19; //Low period of SCL
  
   U0CTL |= I2CEN;// Enable I2C, 7 bit addr
   U0CTL |= MST;   // Master
}



//预启动I2C主发送模式
//从机地址:SlaverAddr 待发送数据字节数:no
//
void I2C_TxStart(unsigned char SlaverAddr,unsigned char size)
{
  while(I2CTCTL & I2CSTP); // To prevent Arbitration Lost
  I2CSA=SlaverAddr; //从机地址
  I2CNDAT = size;  // Transmit no byte 
  
  U0CTL |= MST;    // Master   
  I2CTCTL |= I2CTRX; //发送模式
  I2CTCTL |= I2CSTT + I2CSTP;//发出起始信号,I2CNDAT表示传输字节数,结束后停止位自动产生
}


//I2C发送一字节数据
void I2C_TxByte(unsigned char cdata)
{
  while(!(I2CIFG & TXRDYIFG));//等待发送准备好信号
  I2CDRB = cdata;//发送1字节数据
}

 
//I2C接收一字节数据
unsigned char I2C_RxByte(void)
{
  while(!(I2CIFG & RXRDYIFG));//等待接收准备好信号
  return(I2CDRB);//返回接受到的数据
}


//主机向从机发送多字节
// SlaveAddr:从机地址(7位纯地址,不含读写位)
// SubAddr:从机的子地址
// *str:要发送的数据
// size:数据的字节数
void I2C_TxStr(unsigned char SlaverAddr,unsigned char SubAddr,unsigned char *str,unsigned char size)
{
   unsigned char i;
   I2C_TxStart((SlaverAddr>>1),(size + 1));
   I2C_TxByte(SubAddr);
   for(i=0;i<size;i++)
   {
       while(!(I2CIFG & TXRDYIFG));
       I2CDRB=str[i];
   }
  // while(!(I2CIFG & ARDYIFG));
}


//主机向从机读取多字节
// SlaveAddr:从机地址(7位纯地址,不含读写位)
// SubAddr:从机的子地址
// *str:要发送的数据
// size:数据的字节数
void I2C_RxStr(unsigned char SlaveAddr,unsigned char SubAddr,unsigned char *str,unsigned char size)
{
  unsigned char i;
  while (I2CDCTL & I2CBUSY);  // wait until I2C module has finished all operations
  I2CSA=SlaveAddr>>1;

  U0CTL |= MST;       // Master
  I2CNDAT = 0x01;      // Transmit one byte  

  I2CIFG &= ~TXRDYIFG;  //清除发送准备好标志位
  I2CIFG &= ~ARDYIFG;   // clear Access ready interrupt flag
  I2CTCTL |= I2CTRX;    //手动停止模式 restart模式
  I2CTCTL &= ~I2CSTP;   //????????//清除I2C停止操作位
  I2CTCTL |= I2CSTT;    //启动发送
  I2C_TxByte(SubAddr);  //发送子地址

  while (!(I2CIFG & ARDYIFG));  // wait untill transmission is finished
  I2CNDAT = size;           // Transmit one byte
  I2CTCTL &= ~I2CTRX;   //清除发送位,切换到接受模式
  I2CIFG &= ~ARDYIFG;   // clear Access ready interrupt flag
  I2CTCTL |= I2CSTT + I2CSTP; //发出起始信号,I2CNDAT表示传输字节数,结束后停止位自动产生
  for(i=0;i<size;i++)
    {
      str[i]=I2C_RxByte();//接收信息存储
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -