这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » halibote523使用手记(从安装到程序编写)

共54条 5/6 |‹ 1 2 3 4 5 6 跳转至
专家
2010-10-28 15:08:51     打赏
41楼

模拟I2C程序,EEPROM器件是:AT24C1024,也就是1k bit的,即128k字节
通过串口程序来验证:先写I2C,后读I2C,两者的数相同!!(以下程序中的puts:为串口输出的字符,串口程序参考的UART实验)

#include "mb95200.h"
u8 E0;    //非应答信号标志位
u8 NACK=0;    //错误标志位

#define   SDA    PDR0_P06
#define   SDA_D  DDR0_P06
#define   SCL    PDR0_P05
#define   SCL_D  DDR0_P05
#define WriteDeviceAddress   0xa0   //写I2C外围器件的寻址地址
#define ReadDeviceAddress   0xa1   //读I2C外围器件的寻址地址

void WriteI2C(u8 *Wdata,u8 RomAddress,u8 number); // 写n个字节数据子程序
void ReadI2C(u8 *RamAddress,u8 RomAddress,u8 bytes); // 读n个字节数据子程序

void delay5us(u16 len)
{
    u16 i;
    for(i=0;i<len;i++)
    __wait_nop();
}
void Start(void)    //启动I2C总线子函数
{
   SCL_D=1;
   SCL=1;
   SDA_D=1;
   SDA=1;
  
   delay5us(5);
   SDA=0;
   delay5us(5);
   SCL=0;
}
void Write8Bit(u8 n) //写一个字节数据子程序,n为待发送的数据
{
   u8 i,temp;
   for(i=8;i>0;i--)
      {
      SCL_D=1;
      SDA_D=1;
      temp=n&0x80;
      if(temp==0x80)  SDA=1;
      else            SDA=0;
      SCL=1;
      delay5us(5);
      SCL=0;
      SDA=0;
      n=n<<1;
      }
}

void Stop(void)    //停止I2C总线数据传送子函数
{
   SDA_D=1;
   SDA=0;
   SCL_D=1;
   SCL=1;
   delay5us(5);
   SDA=1;
   delay5us(5);
   SCL=0;
}
void Ack(void)    //发送应答位子程序
{
   SDA_D=1;
   SDA=0;
   SCL_D=1;
   SCL=1;
   delay5us(5);
   SCL=0;
   SDA=1;
}

void NoAck(void)   //发送非应答位子程序
{
   SDA_D=1;
   SDA=0;
   SCL_D=1;
   SCL=1;
   delay5us(5);
   SCL=0;
   SDA=0;
}
void TestAck(void) //应答位检查子程序,若检测不到非应答信号
{
   SDA=1;
   SCL=1;
   SDA_D=0;
   E0=0;
   delay5us(1);
   if(SDA==1) E0=1;
   SCL=0;
}
u8 Read8Bit(void)   //读一个字节数据子程序
{
    uchar temp,rbyte=0;
    for(temp=8;temp>0;temp--)
      {
      SDA_D=0;
      SDA=1;
      SCL_D=1;
      SCL=1;
      delay5us(5);
       rbyte=rbyte<<1;
      rbyte=rbyte|((u8)(SDA));
      SCL=0;
      }
    return(rbyte);
}
void WriteI2C(u8 *Wdata,u8 RomAddress,u8 number) // 写n个字节数据子程序
{     //*Wdata为待发送数据的首地址,RomAddress为待I2C外围器件的数据写入首地址,number为写字节的个数
   Start(); //启动
   Write8Bit(WriteDeviceAddress); //写入器件的寻址地址
   TestAck();    //应答检查
   if(E0==1)
    {
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    puts("NACK00\n");
    return;
    }
   Write8Bit(0x00); //写入I2C器件页地址
   TestAck();    //应答检查
   if(E0==1)
    {
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    puts("NACK01\n");
    return;
    }
   Write8Bit(RomAddress); //写入I2C器件的数据存储首地址
   TestAck();    //应答检查
   if(E0==1)
    {
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    puts("NACK02\n");
    return;
    }
   //zhai start
   //zhai end
   for(;number!=0;number--)   //循环,逐个字节发送
     {
     Write8Bit(*Wdata); //写一个字节
     TestAck();    //应答检查
     if(E0==1)
       {
       NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
       puts("NACK03\n");
       return;
       }
     Wdata++;         //指针增加,指向下一个数据
     }
   Stop();     //全部发送完则停止
}
void ReadI2C(u8 *RamAddress,u8 RomAddress,u8 bytes) // 读n个字节数据子程序
{   //RamAddress为接收数据缓冲区的首地址,RomAddress为待I2C外围器件的数据读取首地址,bytes为写字节的个数
   Start(); //启动
   Write8Bit(WriteDeviceAddress); //写入器件的寻址地址
   TestAck();    //应答检查
   if(E0==1)
    {
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    puts("NACK10\n");
    return;
    }
   Write8Bit(0x00); //写入I2C器件页地址
   TestAck();    //应答检查
   if(E0==1)
    {
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    puts("NACK11\n");
    return;
    }
   Write8Bit(RomAddress); //写入I2C器件内部数据的读取首地址(页内地址)
   TestAck();    //应答检查
   if(E0==1)
    {
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    puts("NACK12\n");
    return;
    }
  
   Start(); //重新启动
   Write8Bit(ReadDeviceAddress); //写入器件的寻址地址 0xA1
   TestAck();    //应答检查
   if(E0==1)
   {
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    puts("NACK13\n");
    return;
   }
   while(bytes!=1)     //循环读入字节数据
    {
    *RamAddress=Read8Bit(); //读入一个字节
    Ack();                //应答
    RamAddress++;      //地址指针递增
    bytes--;     //待读入数据个数递
   }
  *RamAddress=Read8Bit(); //读入最后一个字节数据
  NoAck();   //非应答
  Stop();    //停止
}


专家
2010-10-28 15:16:41     打赏
42楼
原理图如下:



专家
2010-10-30 14:24:26     打赏
43楼
与GPS连接的
1、GPS无效定位时:

2、GPS有效定位时:

3、数据意义:定位时间(年月日时分秒)、定位的位置:经纬度

专家
2010-11-09 14:19:49     打赏
44楼
这两天公布:基于Easykit 的Zigbee的无线控制      
的成果,敬请关注...........

专家
2010-11-09 21:42:54     打赏
45楼
不会的吧?是不是你查错了:
经度:11437.3803  表示:114°   37.3803分==114° 37分 22.818秒
纬度:3802.7010    表示: 38°    2.7010分 ==38°  2分 42.06秒
肯定没错的,在石家庄开发区!你查查看看!!

专家
2010-11-17 08:56:14     打赏
46楼
基于Easykit  的Zigbee的远程控制
无线网络图片:


线束的连接:与Easykit的串口管脚15、16连接!串口通信
右边的直接与PC连接,这样两者个就能实时的通信,也能PC机控制Easykit的外部电路

专家
2010-11-17 09:00:36     打赏
47楼
Xbee数据模块手册: 模块数据手册.pdf
测试的一些总结:

[1]发送选项0x08不被支持。

[2]发送API帧,最大RF数据负载不是72字节,由AT指令中NP命令查看。

[3]64bit目标地址可以设为0,作为协调器地址。

[4]最大广播半径是32

[5]在节点识别指示器(0x95)中,AT指令中NO命令可以被用包含DD参数。

[6]14)节点识别指示器帧的结构需确定。

注明2

nBytes代表字段的大小是可变的。

注明3

API帧中的转义字符(Escape Characters)AT指令中AP命令参数等于2时。

UART帧的收发就需要注意以下方面:

当发出或者到一个串口的数据帧时,特殊数据值必须进行转义,这样的帧就不会与数据帧序干扰。

为了转义干扰数据字节,插入0x7D,其后的字节与0x20异或。

需要转义的数据字节有:0x7E,0x7D,0x11,0x13

转义字符不参于检验和运算。


专家
2010-11-17 09:10:40     打赏
48楼
只公布Easykit与Xbee的程序,Easykit的底层驱动程序不公开,只要设置定时器,UART的波特率:9600,8位数据位,1位停止位,无奇偶校验!

代码已经形成了.c与.h文件:Xbee程序.rar

我测试的时候用一个LED来校验,PC机传输的内容是:0x31,0x32,0x33,0x34,0x35,0x36   ,Easykit收到的内容符合的话LED就点亮(蓝灯)!
当然了,数据内容可以随意的更改,只要是想要得到的数据就行!
应用的场合:无线控制,汽车无线钥匙,无线智能控制等等......

专家
2010-11-21 22:27:55     打赏
49楼

一、申请
二、论坛上的拍卖活动


专家
2010-11-23 08:28:44     打赏
50楼
FUJITSU USB PROGRAMMER和FUJITSU编译环境均在网管上面下载!申请的Easykit开发工具上有链接地址

共54条 5/6 |‹ 1 2 3 4 5 6 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]