|
楼主 |
发表于 2015-1-23 15:18:14
|
显示全部楼层
最新更新:
板子到手后已有一个月了,之前进行了一些简单的IO测试,还简单,
之后再进行I2C操作,看手册,看了也没有啥问题,可后来测试时一直出不来想要的波形,硬I2C不行就用软I2C,
然后就开始搞MLX90614,结果搞了半个月时间(下班业余时间)也没搞出来,用I2C访问,地址读,写有应答,可就是读取数据时没有读取到想要的数据
一直搞到今天早上,实在没有勇气了,准备放弃啦
后来再看一遍手册,发现手册有关于SCL时钟及SDA时钟,有说关于超时问题,说是多少uS高电平超时,
不就是说I2C时钟频率么,
我发现自己的I2C频率有些慢,于是快一点,弄到80KHZ左右,奇迹出现了,出现想要的波形了
下边上传一些调试的数据图片及视频:
关于软I2C代码,
/*------------------------------------------------
启动IIC总线
------------------------------------------------*/
void Start(void)
{
Sda1;
Sleep();
Scl1;
Sleep();
Sda0;
Sleep();
Scl0;
}
///*------------------------------------------------
// 停止IIC总线
//------------------------------------------------*/
void Stop(void)
{
Sda0;
Sleep();
Scl1;
Sleep();
Sda1;
Sleep();
Scl0;
}
///*------------------------------------------------
// 应答IIC总线
//------------------------------------------------*/
void Ack(void)
{
Sda0;
Sleep();
Scl1;
Sleep();
Scl0;
Sleep();
}
///*------------------------------------------------
// 非应答IIC总线
//------------------------------------------------*/
//void NoAck(void)
//{
// Sda1;
// Sleep();
// Scl1;
// Sleep();
// Scl0;
// Sleep();
//}
// /*------------------------------------------------
// 发送一个字节
//------------------------------------------------*/
void I2c_Send(unsigned char Data)//
{
unsigned char BitCounter=8;
unsigned char temp;
do
{
temp=Data;
Scl0;
Sleep();
if((temp&0x80)==0x80)
Sda1;
else
Sda0;
Sleep();
Scl1;
temp=Data<<1;
Data=temp;
BitCounter--;
Sleep();
}
while(BitCounter);
Scl0;
}
// /*------------------------------------------------
// 读入一个字节并返回
//------------------------------------------------*/
unsigned char I2c_Read(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8;
Sda1;
Sleep();
do
{
Sleep();
Scl0;
Sleep();
Scl1;
Sleep();
if(GPIOE_PDIR&BIT25)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
Scl0;
Sleep();
return(temp);
}
unsigned char Busy(void) //读忙标记 是否应答
{
unsigned char temp;
Scl0;
Sleep();
Sda1;
Sleep();
Scl1;
Sleep();
temp=GPIOE_PDIR&BIT25;
// Sleep();
Scl0;
if(temp)
temp=1;
return temp;
}
==============================================
读取MLX90614 RAM数据代码 RAM 中06是环境温度数据,07是目标温度数据,如果是双温度的,08是目标温度2
uint16 Read_cc(unsigned char add){ //读取RAM数据
unsigned char Data1;
unsigned char Data2;
unsigned char Data3;
unsigned char Flg; //数据低位,高位,校检码,状态码
Flg=1;
Start();
I2c_Send(0xB4); //B4 7地址+1Wr 广播地址,默认地址0x5A 1011010 + 0
//B4 地址5A+写0
if (Busy()==0){ //应答了
//send_byte(01);
I2c_Send(add); //000x xxxx 00000111 07h Tobj1 温度1
//命令 06读环境温度 07读目标温度
// 20 读取EEPROM 最大值 21h 读取最小值 22PWM设定 23传输温度上下限 2E地址
if (Busy()==0){ //继续读取
//send_byte(02);
Start(); //重新初始化
I2c_Send(0xB5); //B5 地址+读取
if (Busy()==0){
//send_byte(03);
Data1=I2c_Read(); //数据低字节
Ack(); /*//读取后应答 */
Data2=I2c_Read(); //数据高字节
Ack();
Data3=I2c_Read(); //PEC CRC8校验码
Ack();
Stop();
Flg=0; //完毕,成功!
}
}
}
if(Flg){ //未应答,复位
Stop();
}
return (Data2<<8) | Data1 ;
}
===============================
上边代码基本上可以直接读取MLX90614的温度数据了,
KL25的硬I2C实在搞不定了,郁闷啊
以下是代码,有问题
初始化I2C
void InitI2C(void){ //初始化I2C相关功能
SIM_SCGC5=SIM_SCGC5_PORTE_MASK|SIM_SCGC5_PORTB_MASK; //PORTE PORTB
PORTE_PCR24=(5<<PORT_PCR_MUX_SHIFT)|PORT_PCR_PE_MASK; //功能5 I2C_scl pe24 pe25
PORTE_PCR25=(5<<PORT_PCR_MUX_SHIFT)|PORT_PCR_PE_MASK; //功能5 I2C_sda 使能上拉
SIM_SCGC4=SIM_SCGC4_I2C0_MASK; //I2C0 ENA
I2C0_F=0x27; //24Mhz/(1*480)=50khz
I2C0_C1=I2C_C1_IICEN_MASK|I2C_C1_IICIE_MASK; //开启I2C|开启中断
NVIC_EnableIRQ(I2C0_IRQn);
}
然后I2C中断,搞不定,也不贴了,
下一贴再上传图片及视频 |
|