智能车制作
标题:
我写了个IIC通信程序可是无论怎么采集都是255请高手指点下
[打印本页]
作者:
fengtian123
时间:
2011-12-8 10:35
标题:
我写了个IIC通信程序可是无论怎么采集都是255请高手指点下
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
#define uint unsigned int
#define uchar unsigned char
#define SDA PTT_PTT1
#define SCL PTT_PTT2
uchar I2C_ERROR; /*应答标志位*/
uchar reader ;
#define WRITE 0x1d /*写器件地址 */
#define READ 0x1d /*读器件地址 */
void sci (void){
SCI0CR1=0x00; //设置SCI0为正常模式,八位数据位,无奇偶校验
SCI0CR2_TE=1; //允许发送
SCI0CR2_RE=1; //允许接受
SCI0CR2_RIE=1; //允许接受中断
//botelu=busclock/(bd(h,l)*16)=80MHZ/(520*16)=9600
SCI0BD=208;
}
void shuchuzifu(char ch){
if (ch =='\n')
{
while(!(SCI0SR1&0x80)) ;
SCI0DRL= 0x0d; //output'CR'
return;
}
while(!(SCI0SR1&0x80)) ; //keep waiting when not empty
SCI0DRL=ch;
}
void SetBusCLK_32M(void)
{
CLKSEL=0X00; // disengage PLL to system
PLLCTL_PLLON=1; // turn on PLL
SYNR =0x40 | 0x03; // pllclock=2*osc*(1+SYNR)/(1+REFDV)=64MHz;
REFDV=0x80 | 0x01;
POSTDIV=0x00;
_asm(nop); // BUS CLOCK=32M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}
void init_system()
{
DDRT_DDRT2=1;
DDRT_DDRT1=1;
}
/****************************准确延时*****************************/
void Delay()//////// /*根据晶振频率制定延时时间*/
{
_asm NOP; _asm NOP;_asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;
}
void Delay1us(int c)
{
int cnt;
for(cnt=0;cnt<c;cnt++)
{
asm("nop"); asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
}
}
void initiic() {
SCL=1;
Delay1us(5);
SDA=1;
Delay1us(5);
}
/*******************************************************************
起动总线函数
函数原型: void Start_I2c();
功能: 启动I2C总线,即发送I2C起始条件.
********************************************************************/
void I2C_START()
{
SDA=1;
Delay1us(5);
SCL=1;
Delay1us(5);
SDA=0;
Delay1us(5);
}
/*******************************************************************
结束总线函数
函数原型: void Stop_I2c();
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
void I2C_STOP()
{
SDA=0; /*发送结束条件的数据信号*/
Delay1us(5); /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4us*/
Delay1us(5);
SDA=1; /*发送I2C总线结束信号*/
Delay1us(5);
}
/*******************************************************************/
void send_nack()
{
SDA=1;
Delay1us(5);
SCL=1;
Delay1us(5);
SCL=0;
Delay1us(5);
}
/*******************************************************************
检查应答位
********************************************************************/
void check_ack()
{
uchar i=0;
SCL=1;
DDRT_DDRT1=0;
Delay1us(5);
while((SDA==1)&&(i<255))
i++;
SCL=0;
Delay1us(5);
DDRT_DDRT1=1;
}
/*******************************************************************
发送1字节数据
********************************************************************/
void I2C_send(uchar data)
{
uint i=8;
uchar m=data;
uchar temp;
for(i=8;i>0;i--){
temp=m&0x80;
SCL=0;
Delay1us(5);
if(temp==0x80)
SDA=1;
else
SDA=0;
Delay1us(5);
SCL=1;
Delay1us(5);
m=m<<1;
}
SCL=0;
Delay();
SDA=1;
Delay();
shuchuzifu('0');
}
/********************************************************************
接收1字节数据
********************************************************************/
void I2C_receive1byte()
{
int i=8;
uchar j=0;
SCL=0;
Delay1us(5);
SDA=1;
Delay1us(5);
DDRT_DDRT1=0;
for(i=8;i>0;i--)
{
SCL=1;
Delay1us(5);
j=(j<<1)|SDA;
SCL=0;
Delay1us(5);
}
DDRT_DDRT1=1;
reader=j;//把reader定义成全局变量
shuchuzifu('1');
}
/*******************************************************************
******通过I2C总线向某一寄存器写入一个字节数据********
********************************************************************/
void I2C_write(uchar sub_address,uchar content)
{
I2C_START();
I2C_send(0X3A);
check_ack();
I2C_send(sub_address);
check_ack();
I2C_send(content);
check_ack();
I2C_STOP();
}
/*******************************************************************
通过I2C总线读出某一寄存器的数据
注意: 使用前必须已结束总线。
********************************************************************/
void I2C_READ(uchar address)
{
I2C_START();
I2C_send(0X3A);
check_ack();
I2C_send(address);
check_ack();
I2C_START();
I2C_send(0X3A+1);
check_ack();
I2C_receive1byte();
check_ack();
I2C_STOP();
}
//}
/*****************************************************************/
void main()
{
int i=0;
SetBusCLK_32M() ;
sci();
init_system();
initiic();
I2C_write(0x16,0x05);
I2C_write(0x10,0x32);
for(;;)
{
I2C_READ(0x06);
shuchuzifu(reader);
for(i=0;i<100;i++)
_asm NOP;
}
}
复制代码
作者:
fengtian123
时间:
2011-12-8 10:50
顶起~~~求助
作者:
fengtian123
时间:
2011-12-8 10:51
顶起~~~求助
作者:
fengtian123
时间:
2011-12-8 11:58
1111111
作者:
midanshen1
时间:
2011-12-8 12:42
看不懂!!!
作者:
ttzaio
时间:
2011-12-8 13:40
可能某些端口的赋值有冲突,
作者:
fengtian123
时间:
2011-12-8 16:57
回复
6#
ttzaio
刚刚测试了下~发现从机不发送应答信号~哎
作者:
whut_RY
时间:
2011-12-8 19:34
是从BDM上看的吗?我的SPI也是这样全是255但是它确实工作了
作者:
xining_yang
时间:
2011-12-8 21:46
这个是干吗用的????
作者:
fengtian123
时间:
2011-12-8 21:58
回复
8#
whut_RY
额~我这个不是用的SPI用的是IIC SPI没有调试成功~不知道为什么~BDM不出数据用串口发送出来的数据也不对啊~
作者:
双驱二轮车
时间:
2011-12-8 22:07
进度都很快呀,我们还在找电路模块呢
作者:
whut_RY
时间:
2011-12-9 22:56
回复
10#
fengtian123
内部SPI我没有调成功,但是确实出波形了,最后用IO口模拟做好了,我说的是5110液晶驱动。加速度传感器MMA8451要用IIC,这个自己写有难度啊,不知道要折腾几天,痛苦。。。
作者:
fengtian123
时间:
2011-12-11 16:26
回复
12#
whut_RY
我的加速度传感器是MMA7455这个芯片可以用SPI方式和IIC方式通信的~现在贴出来的程序就是用I/O模拟IIC方式进行通信的程序~可是就是不能出东西~哎无语了~不知道你的IIC程序怎么写的~能借鉴下么?
后来用标志位进行调节了~发现从机不产生应答信号~哎~无语啊~
作者:
whut_RY
时间:
2011-12-12 12:26
我这个星期晚上才有时间,写好了交流交流
作者:
bdc90
时间:
2011-12-12 18:42
回复
13#
fengtian123
哈哈,本人用XS128读写过24C02 么得问题
作者:
whut_RY
时间:
2011-12-14 11:59
回复
13#
fengtian123
你的问题是没有设置端口的方向
作者:
恋May
时间:
2011-12-14 13:54
作者:
fengtian123
时间:
2011-12-17 11:48
回复
16#
whut_RY
有啊~outa为 #define outa DDRT_DDRT1
作者:
fengtian123
时间:
2011-12-17 11:48
回复
15#
bdc90
额要注意点什么呢?能给写提示么?
作者:
bdc90
时间:
2011-12-17 19:42
回复
19#
fengtian123
就是多了个方向寄存器的设置。这是移植的代码,你可以参考参考。
作者:
hanahimiEX
时间:
2011-12-18 17:32
看不出来啊
作者:
hanahimiEX
时间:
2011-12-18 17:33
怎么回事啊
作者:
15239172008
时间:
2012-2-16 20:54
等待高手……
作者:
15239172008
时间:
2012-2-16 20:56
作者:
B-Boy_Chao
时间:
2012-5-12 13:58
你发送的地址对吗?
作者:
miss_lion
时间:
2015-5-8 12:04
请问您的问题解决了么
欢迎光临 智能车制作 (http://111.231.132.190/)
Powered by Discuz! X3.2