📄 i2c_hard.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 + -