MSP430学习的第一个模拟I2C程序
来源:互联网 发布:山东实验中学校服淘宝 编辑:程序博客网 时间:2024/06/07 23:16
#include <msp430.h>
unsigned char I2CBUF;
unsigned char checkbit;
#define SCL_H (P10OUT |= BIT2) // P10.2为SCL
#define SCL_L (P10OUT &= ~BIT2)
#define SDA_H (P10OUT |= BIT1) //p10.1为SDA
#define SDA_L (P10OUT &= ~BIT1)
#define SDA_OUT (P10DIR |= BIT1)
#define SDA_IN (P10DIR &= ~ BIT1)
void I2C_Start(void) //I2C开始信号
{
SDA_OUT;
SCL_L;
SDA_H;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
SDA_L;
__delay_cycles(5);
SCL_L;
__delay_cycles(5);
}
unsigned char testACK(void) {
SDA_IN;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
checkbit = (P10IN & BIT1) >> 4;
__delay_cycles(5);
SCL_L;
__delay_cycles(5);
return (checkbit);
}
void I2C_ACK(void) //应答信号
{
SDA_OUT;
SCL_L;
SDA_L;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
SCL_L;
__delay_cycles(5);
SDA_H;
}
void I2C_NACK(void) {
SDA_OUT;
SDA_H;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
SCL_L;
__delay_cycles(5);
}
void I2C_STOP(void) //产生结束信号
{
SCL_L;
__delay_cycles(5);
SDA_L;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
SDA_H;
__delay_cycles(5);
}
void I2C_WRITE(unsigned char data)
{
SDA_OUT;
unsigned char i;
for (i = 8; i > 0; i--) //高位循环8次,发送1个字节数据
{
if (data & 0x80) //判断数据高位是0还是1
{
SDA_H; //高位数据写1
}
else
{
SDA_L;
}
SCL_H;
__delay_cycles(5); //发送数据
SCL_L;
__delay_cycles(5);
data <<= 1;
unsigned char I2CBUF;
unsigned char checkbit;
#define SCL_H (P10OUT |= BIT2) // P10.2为SCL
#define SCL_L (P10OUT &= ~BIT2)
#define SDA_H (P10OUT |= BIT1) //p10.1为SDA
#define SDA_L (P10OUT &= ~BIT1)
#define SDA_OUT (P10DIR |= BIT1)
#define SDA_IN (P10DIR &= ~ BIT1)
void I2C_Start(void) //I2C开始信号
{
SDA_OUT;
SCL_L;
SDA_H;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
SDA_L;
__delay_cycles(5);
SCL_L;
__delay_cycles(5);
}
unsigned char testACK(void) {
SDA_IN;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
checkbit = (P10IN & BIT1) >> 4;
__delay_cycles(5);
SCL_L;
__delay_cycles(5);
return (checkbit);
}
void I2C_ACK(void) //应答信号
{
SDA_OUT;
SCL_L;
SDA_L;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
SCL_L;
__delay_cycles(5);
SDA_H;
}
void I2C_NACK(void) {
SDA_OUT;
SDA_H;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
SCL_L;
__delay_cycles(5);
}
void I2C_STOP(void) //产生结束信号
{
SCL_L;
__delay_cycles(5);
SDA_L;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
SDA_H;
__delay_cycles(5);
}
void I2C_WRITE(unsigned char data)
{
SDA_OUT;
unsigned char i;
for (i = 8; i > 0; i--) //高位循环8次,发送1个字节数据
{
if (data & 0x80) //判断数据高位是0还是1
{
SDA_H; //高位数据写1
}
else
{
SDA_L;
}
SCL_H;
__delay_cycles(5); //发送数据
SCL_L;
__delay_cycles(5);
data <<= 1;
}
}
unsigned char I2C_READ(void)
{
unsigned char j;
unsigned char BUFFER = 0X00;
SDA_IN;
for (j = 8; j >0; j--) //高位循环8次,发送1个字节数据
{
SCL_H;
__delay_cycles(5);
BUFFER <<= 1;
if ((P10IN & BIT1) == BIT1) //判断数据高位是0还是1
{
BUFFER |= 0X01; //高位数据写1
}
else
{
BUFFER |= 0XFE;
}
__delay_cycles(5); //发送数据
SCL_L;
__delay_cycles(5);
}
return BUFFER;
}
void C16_WRITEDATA(unsigned char address, unsigned char DATA)
{
I2C_Start();
I2C_WRITE(address);
testACK();
I2C_ACK();
I2C_WRITE(0x00);
testACK();
I2C_ACK();
I2C_WRITE(DATA);
I2C_STOP();
}
unsigned char C16_READEDATA(unsigned char address)
{
unsigned char READDATA;
I2C_Start();
I2C_WRITE(0XA1);
testACK();
I2C_ACK();
I2C_WRITE(address);
I2C_Start();
testACK();
I2C_ACK();
I2C_WRITE(0XA1);
READDATA = I2C_READ();
I2C_STOP();
return READDATA;
}
int main(void)
{
const int DATA = 0X88;
unsigned char READBUFFER;
WDTCTL = WDTPW + WDTHOLD;
P10DIR |= BIT1 + BIT2;
P2DIR |= BIT0;
P2OUT &= ~BIT0;
C16_WRITEDATA(0X00, DATA);
__delay_cycles(5);
READBUFFER = C16_READEDATA(0X00);
while (1)
{
if (READBUFFER == 0X88)
{
P2OUT |= BIT0;
} else {
P2OUT &= ~ BIT0;
}
__delay_cycles(15);
}
}
}
unsigned char I2C_READ(void)
{
unsigned char j;
unsigned char BUFFER = 0X00;
SDA_IN;
for (j = 8; j >0; j--) //高位循环8次,发送1个字节数据
{
SCL_H;
__delay_cycles(5);
BUFFER <<= 1;
if ((P10IN & BIT1) == BIT1) //判断数据高位是0还是1
{
BUFFER |= 0X01; //高位数据写1
}
else
{
BUFFER |= 0XFE;
}
__delay_cycles(5); //发送数据
SCL_L;
__delay_cycles(5);
}
return BUFFER;
}
void C16_WRITEDATA(unsigned char address, unsigned char DATA)
{
I2C_Start();
I2C_WRITE(address);
testACK();
I2C_ACK();
I2C_WRITE(0x00);
testACK();
I2C_ACK();
I2C_WRITE(DATA);
I2C_STOP();
}
unsigned char C16_READEDATA(unsigned char address)
{
unsigned char READDATA;
I2C_Start();
I2C_WRITE(0XA1);
testACK();
I2C_ACK();
I2C_WRITE(address);
I2C_Start();
testACK();
I2C_ACK();
I2C_WRITE(0XA1);
READDATA = I2C_READ();
I2C_STOP();
return READDATA;
}
int main(void)
{
const int DATA = 0X88;
unsigned char READBUFFER;
WDTCTL = WDTPW + WDTHOLD;
P10DIR |= BIT1 + BIT2;
P2DIR |= BIT0;
P2OUT &= ~BIT0;
C16_WRITEDATA(0X00, DATA);
__delay_cycles(5);
READBUFFER = C16_READEDATA(0X00);
while (1)
{
if (READBUFFER == 0X88)
{
P2OUT |= BIT0;
} else {
P2OUT &= ~ BIT0;
}
__delay_cycles(15);
}
}
阅读全文
0 0
- MSP430学习的第一个模拟I2C程序
- MSP430学习的第一个模拟I2C程序
- msp430使用i2c的局限
- [MSP430] 1.第一个工程
- 第一个写的程序:万象加钱器模拟
- 学习wxPython 的第一个程序
- 第一个java程序的学习
- android学习_android的第一个程序
- qt学习的第一个程序
- 开始iOS第一个程序的学习
- 学习android的第一个程序
- 学习Java的第一个程序
- 学习opencv的第一个程序
- 学习的第一个python程序
- 阅读学习的第一个python程序
- io模拟i2c程序
- STM32模拟I2C程序
- STM8S 模拟I2C程序
- 解决cocos2d-x 后台切换后没有音效的问题
- 第十周项目1--二叉树遍历的非递归算法
- 【笔记】双十一「剁手」背后的客服暗战
- 讲给Android程序员看的前端教程(16)——伪类
- linux 中数据的含义 /proc/sys/fs/file-nr
- MSP430学习的第一个模拟I2C程序
- kkpager分页插件的Ajax数据变化但是页码不变的问题
- JQuery常用方法
- 利用回归树对Boston房价进行预测,并对结果进行评估
- 数据结构上机实践第五周项目3
- linux内核数据结构sk_buff偏移正解
- Docker:《二》DockerFile制作image
- Auth类认证
- placeholder在浏览器ie9以下不支持之一种解决方法