永发信息网

关于MSP430F169使用IIC模块,向24C02发送与接收数据的问题

答案:1  悬赏:50  手机版
解决时间 2021-03-24 22:06
关于MSP430F169使用IIC模块,向24C02发送与接收数据的问题
最佳答案
给个我用的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'为结尾标记
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
单选题下列日常生活中的行为不利于培养自立能
风景园林是什么
有个论文想发表,不知道投哪个期刊 能否被录
口袋妖怪叶绿1号岛下方宝藏海滨谁知道怎么去
青云门的唤雷剑诀需要哪个门派的队友来触发
长红旅馆这个地址在什么地方,我要处理点事
IsJackgoingthereatonce?Ithinks
两个土读什么,一个木字旁加两个土怎么读
自己指纹在网吧绑定是别人的身份证能换过来吗
西南医院做人流多少费用
我很爱我的老公。老公平时比较话少,怎么样才
再除以0.05,商是多少
怎样免领流量
100万平方米是多少亩
沈阳坤泰信息科技有限公司我想知道这个在什么
推荐资讯
关于景物描写,有哪些精美的的句子或段落
承的音序是什么意思,膜的拼音是什么?
国家统计局垣曲调查队地址在哪,我要去那里办
邮政2O17元旦理财产品
和平街十区怎么样?好不好?值不值得买?
在右面的程序框图中,要求输出三个实数a、b、
有一句歌词叫撒郎嘿什么yinayou
神武转门派需要什么,神武如何转换门派 转换门
贵州自学考试成绩档案怎么查询
求画家杨寿平的基本资料
像O,l,2,3,4,5,…这样的数是()。
1公斤煤的热量
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?