关于MSP430F169使用IIC模块,向24C02发送与接收数据的问题
答案:1 悬赏:50 手机版
解决时间 2021-03-24 22:06
- 提问者网友:战魂
- 2021-03-23 22:18
关于MSP430F169使用IIC模块,向24C02发送与接收数据的问题
最佳答案
- 五星知识达人网友:街头电车
- 2021-03-23 23:26
给个我用的5438的代码,模拟的
你只需要修改设备地址和想要使用的IO口就行,都一样
IIC.h
#ifndef IIC_H_
#define IIC_H_
#define scl_1 P2OUT |= BIT1 //SCL
#define scl_0 P2OUT &=~BIT1
#define sda_1 P2OUT |= BIT2 //SDA
#define sda_0 P2OUT &=~BIT2
#define sda_H P2IN & BIT2
#define DIR_IN P2DIR &=~BIT2
#define DIR_OUT P2DIR |=BIT2
#define Address 0xD0 //设备地址
extern void IIC_init(void);
extern void IIC_start(void);
extern void IIC_stop();
extern void IIC_writex(unsigned char j);
extern unsigned char IIC_readx(void);
extern void IIC_ack(void);
extern unsigned char IIC_read(unsigned char address); //读地址为address的值
extern void IIC_write(unsigned char address, unsigned char info); //写值info到地址address处
#endif
IIC.c
#include "msp430x54x.h"
#include "UCS.h"
#include "IIC.h"
void IIC_init(void)
{
scl_1;
delay_us(5);
sda_1;
delay_us(5);
}
void IIC_start(void)
{
scl_1;
delay_us(5);
sda_1;
delay_us(5);
sda_0;
delay_us(5);
scl_0;
delay_us(5);
}
void IIC_stop()
{
scl_0;
delay_us(5);
sda_0;
delay_us(5);
scl_1;
delay_us(5);
sda_1;
delay_us(5);
}
void IIC_writex(unsigned char j)
{
unsigned char i,temp;
temp = j;
for(i=0; i<8; i++)
{
scl_0;
delay_us(5);
if(temp & 0x80) sda_1;
else sda_0;
delay_us(5);
scl_1;
delay_us(5);
temp = temp << 1;
}
scl_0;
delay_us(5);
}
unsigned char IIC_readx(void)
{
unsigned char i, j, k = 0;
for(i=0; i<8; i++)
{
scl_0;
delay_us(5);
DIR_IN;
if(sda_H)
{
j = 1;
}
else j = 0;
DIR_OUT;
k = (k << 1) | j;
scl_1;
delay_us(5);
}
return(k);
}
void IIC_ack(void)
{
unsigned char i = 0;
scl_1;
delay_us(5);
DIR_IN;
while((sda_H) && (i < 255))
{
i++;
}
DIR_OUT;
scl_0;
delay_us(5);
}
unsigned char IIC_read(unsigned char address)
{
unsigned char i;
IIC_start();
IIC_writex(Address);
IIC_ack();
IIC_writex(address);
IIC_ack();
IIC_start();
IIC_writex(Address+1);
IIC_ack();
i = IIC_readx();
IIC_stop();
return(i);
}
void IIC_write(unsigned char address, unsigned char info)
{
IIC_start();
IIC_writex(Address);
IIC_ack();
IIC_writex(address);
IIC_ack();
IIC_writex(info);
IIC_ack();
IIC_stop();
}
备注:使用了自己写的UCS.h的延时函数
具体使用的代码部分为:
#define CPU_F ((double)16000000) //16000000为你的MCLK频率
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))追问我使用的是24c02,器件地址是0xa0,为写,那你这个函数要实现读回来的值在P口指示LED,
IIC_write(0xa0,0x10);//向器件ox10地址写入数据0x10
P1DIR=0xff;
P1OUT=char IIC_read(0x10);读0x10地址的数据,并显示在P1口,对不对????追答不对,
IIC_write(add,val) //在设备中写地址为add处值为val
char IIC_read(add)//读设备中地址为add处的值
通常一个程序面只操作一个IIC设备,如果要多个设备,请修改宏定义中的设备值追问{IIC_write(0xa0,0x10);//oxa0地址写入数据0x10
P1DIR=0xff;
P1OUT=char IIC_read(0xa0);}//不对????????追答这回对了,要区分好设备地址和要读写的数据的地址。一般大家都把设备地址宏定义,其他的就要看具体寄存器了。而24c02则所有地址都可读写,你可以从IIC_write(0x00,val)开始,对应的直接读IIC_read(0x00)。
比如:写字符串:
void write_str(unsigned char address,char *str) //从储存地址address开始写字符串str
{
unsigned char i=0;
while(str[i] != '\0')
{
IIC_write(address++,str[i]);
i++;
}
IC_write(address,'\0'); //字符串以'\0'为结尾标记
}
你只需要修改设备地址和想要使用的IO口就行,都一样
IIC.h
#ifndef IIC_H_
#define IIC_H_
#define scl_1 P2OUT |= BIT1 //SCL
#define scl_0 P2OUT &=~BIT1
#define sda_1 P2OUT |= BIT2 //SDA
#define sda_0 P2OUT &=~BIT2
#define sda_H P2IN & BIT2
#define DIR_IN P2DIR &=~BIT2
#define DIR_OUT P2DIR |=BIT2
#define Address 0xD0 //设备地址
extern void IIC_init(void);
extern void IIC_start(void);
extern void IIC_stop();
extern void IIC_writex(unsigned char j);
extern unsigned char IIC_readx(void);
extern void IIC_ack(void);
extern unsigned char IIC_read(unsigned char address); //读地址为address的值
extern void IIC_write(unsigned char address, unsigned char info); //写值info到地址address处
#endif
IIC.c
#include "msp430x54x.h"
#include "UCS.h"
#include "IIC.h"
void IIC_init(void)
{
scl_1;
delay_us(5);
sda_1;
delay_us(5);
}
void IIC_start(void)
{
scl_1;
delay_us(5);
sda_1;
delay_us(5);
sda_0;
delay_us(5);
scl_0;
delay_us(5);
}
void IIC_stop()
{
scl_0;
delay_us(5);
sda_0;
delay_us(5);
scl_1;
delay_us(5);
sda_1;
delay_us(5);
}
void IIC_writex(unsigned char j)
{
unsigned char i,temp;
temp = j;
for(i=0; i<8; i++)
{
scl_0;
delay_us(5);
if(temp & 0x80) sda_1;
else sda_0;
delay_us(5);
scl_1;
delay_us(5);
temp = temp << 1;
}
scl_0;
delay_us(5);
}
unsigned char IIC_readx(void)
{
unsigned char i, j, k = 0;
for(i=0; i<8; i++)
{
scl_0;
delay_us(5);
DIR_IN;
if(sda_H)
{
j = 1;
}
else j = 0;
DIR_OUT;
k = (k << 1) | j;
scl_1;
delay_us(5);
}
return(k);
}
void IIC_ack(void)
{
unsigned char i = 0;
scl_1;
delay_us(5);
DIR_IN;
while((sda_H) && (i < 255))
{
i++;
}
DIR_OUT;
scl_0;
delay_us(5);
}
unsigned char IIC_read(unsigned char address)
{
unsigned char i;
IIC_start();
IIC_writex(Address);
IIC_ack();
IIC_writex(address);
IIC_ack();
IIC_start();
IIC_writex(Address+1);
IIC_ack();
i = IIC_readx();
IIC_stop();
return(i);
}
void IIC_write(unsigned char address, unsigned char info)
{
IIC_start();
IIC_writex(Address);
IIC_ack();
IIC_writex(address);
IIC_ack();
IIC_writex(info);
IIC_ack();
IIC_stop();
}
备注:使用了自己写的UCS.h的延时函数
具体使用的代码部分为:
#define CPU_F ((double)16000000) //16000000为你的MCLK频率
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))追问我使用的是24c02,器件地址是0xa0,为写,那你这个函数要实现读回来的值在P口指示LED,
IIC_write(0xa0,0x10);//向器件ox10地址写入数据0x10
P1DIR=0xff;
P1OUT=char IIC_read(0x10);读0x10地址的数据,并显示在P1口,对不对????追答不对,
IIC_write(add,val) //在设备中写地址为add处值为val
char IIC_read(add)//读设备中地址为add处的值
通常一个程序面只操作一个IIC设备,如果要多个设备,请修改宏定义中的设备值追问{IIC_write(0xa0,0x10);//oxa0地址写入数据0x10
P1DIR=0xff;
P1OUT=char IIC_read(0xa0);}//不对????????追答这回对了,要区分好设备地址和要读写的数据的地址。一般大家都把设备地址宏定义,其他的就要看具体寄存器了。而24c02则所有地址都可读写,你可以从IIC_write(0x00,val)开始,对应的直接读IIC_read(0x00)。
比如:写字符串:
void write_str(unsigned char address,char *str) //从储存地址address开始写字符串str
{
unsigned char i=0;
while(str[i] != '\0')
{
IIC_write(address++,str[i]);
i++;
}
IC_write(address,'\0'); //字符串以'\0'为结尾标记
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯