打印

RS232转换I2C问题

[复制链接]
1022|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hsbjb|  楼主 | 2013-6-26 19:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序将RS232转换为I2C。通过串口助手发送10个字节数据。测试SDL/SCL波形都是对的如下图那个宽的波形。但第二次发同样字节的数据,波形是下图窄的波形,放大后是下第二个图。不知道是哪来的。我在第三次发这10个字节,波形又对了,第四次波形又错成这个窄的了。对一次,错一次。不知道为什么。大家帮我看看啊。
#include <reg52.h>       
#include "intrins.h"
#include "stdlib.h"
#include "stdio.h"
sbit          SDA=P2^2;                    
sbit          SCL=P2^3;                    
sbit            SW1 =P1^0;
sbit            SW2 =P1^1;
sbit            SW3 =P1^2;
sbit            SW4 =P1^3;
sbit             INH1=P2^4;
sbit        BEEP=P2^1;
int         *pBlock;
int         length;
int j;
int a[10];
int *pt=a;
int d;
#define uchar unsigned char
#define  I2C_BUSY   1
#define  I2C_READY  0

//延时
void DelayMS(int ms)
{
int i;
while(ms--)
for(i=0;i<120;i++);
}

void WaitforIO()
{
    DelayMS(1);
}
  
void  I2CSTART()         //开始信号
{
    SDA=1;
    SCL=1;
    WaitforIO();

    SDA=0;
    WaitforIO();

    SCL=0;
WaitforIO();                //0815 Add
}

void  I2CSTOP()          //停止信号
{
    SDA=0;
    SCL=0;
    WaitforIO();

SCL=1;
    WaitforIO();

    SDA=1;
    WaitforIO();                 //0815 Add
}

bit Ask()                             //应答信号
{
    bit ack_bit;        
    SDA = 1;         
WaitforIO();            
WaitforIO();
SCL = 1;      
WaitforIO();                     
ack_bit = SDA;            
WaitforIO();                
SCL = 0;
    WaitforIO();         
return  ack_bit;       
}

  int WriteI2C(int SendData)        //发送1个字节
{
unsigned int BitSelect = 0x80;
while(BitSelect)
{
if(BitSelect&SendData)
SDA=1;
else
SDA=0;
    WaitforIO();

SCL=1;
    WaitforIO();
SCL=0;
WaitforIO();

BitSelect>>=1;
}
}       
void comm_init(void)                     //串口初始化
{                  
TMOD=0x20;                        //定时器T1,方式2,定时        
PCON=PCON&0x7f;                   //SMOD=0
SCON=0x50;            //串口工作方式1,允许串行接收
TH1=0xfd;                         //波特率9600,频率11.0592MHZ
TL1=0xfd;
TR1=1;                            //开定时器T1运行控制位
     EA=1;            //开中断
ES=1;                             //允许串行中断  
}


void send(int dat)                           //发送子程序
{     
                             //发送中断标志位清零
       SBUF =dat;                      //要发送的字符放入缓冲区
       while(TI==0);
   TI = 0;
   
}
void receive(void) interrupt 4         //中断方式接收
{   
     if(RI==1)            //检测是否接收到数据
         {
   RI=0;            //接收中断标志位清零
           a[j]=SBUF;                   
   send(a[j]);
   
   j++;
   if(j==10)
   {
                 j=0;
d=1;  
           }


  //取接收的数据       
          //SBUF=a[j];
         }
//  recv_state=1;
// else
//         TI=0;
   
       //        }
}

void  main(void)
{         
BEEP=0;
INH1=1;
SDA=1;
SCL=1;
comm_init();
d=0;    //判断串口是否发送数,0未发送,1发送。
while(1)
{                        
if(d==1)
{       
    d=0;
I2CSTART();
    I2CSTART();
WriteI2C(a[0]);
               for(j=1;j<10;j++)
    {
      if(!Ask())
      {
   WriteI2C(a[j]);           
       }
              }       
   I2CSTOP();
   I2CSTOP();             
}          
  }
}

相关帖子

沙发
秋天落叶| | 2013-6-26 19:43 | 只看该作者
问题大概出在你的串口接收中断和IIC发送共用一个下标变量上

使用特权

评论回复
板凳
xsgy123| | 2013-6-26 19:56 | 只看该作者
是不是哪个地方延迟不对?

使用特权

评论回复
地板
sinadz| | 2013-6-26 20:05 | 只看该作者
看楼主的程序第一感觉就是没有层次感,太乱了。第二个图只看到了8个clk时钟,第9个呢?没有第9个时钟何来ACK信号

使用特权

评论回复
5
txcy| | 2013-6-27 18:25 | 只看该作者
程序太长了,实在是没有耐心看完

使用特权

评论回复
6
vivilzb1985| | 2013-7-18 23:41 | 只看该作者
这个主要是看下RS232的波特率的跟I2C总线的SCK的时钟的,需要两者比较相近才可仪的

使用特权

评论回复
7
shenmu2012| | 2013-7-23 22:52 | 只看该作者
程序的看着有点蒙的,不过主要时注意电平的变化的

使用特权

评论回复
8
comeon201208| | 2013-7-23 22:55 | 只看该作者
路过,讲232口线的数据利用I2C总线传输给其他外设的,也不是很难的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

193

主题

2354

帖子

0

粉丝