[PIC®/AVR®/dsPIC®产品] 【CuriosityNano测评报告】03.串口通讯实验及I2C驱动DS1307日历...

[复制链接]
 楼主| hu9jj 发表于 2021-8-27 11:09 | 显示全部楼层 |阅读模式
#申请原创#

    一、串口通讯实验

    配置串口比较简单,进入MCC,添加UART1,选择RB5为RX,RB7为TX:


    配置UART的速率为9600,并选择Redirect STDIO to UART,这样就方便直接使用printf函数通过串口发送数据:


    生成代码后,在main函数中添加printf命令,我是在主循环之前先发送“开始运行!”,然后在主循环中每秒发送一次“串口通讯测试!”:


    下面是运行时通过串口通讯助手获得的测试结果:


    二、I2C通讯实验

    本次I2C通讯是在前次PIC18F16Q40核心板测试的基础上进行的,使用的是硬件I2C,参考MCC生成的i2c_master_example.c代码写成的针对8位寄存器地址多字节写操作以及16位寄存器地址的单字节和多字节的读写操作函数:


    添加的函数代码如下:
  1. ///////////////添加的测试函数
  2. void I2C_8addrBuffWrite(i2c1_address_t address, uint8_t reg, uint8_t *data, uint8_t len)   //8位地址多字节写
  3. {
  4.     uint8_t i,Buffer[20];
  5.     Buffer[0] = reg;
  6.     for(i=1; i<(len+1); i++){
  7.         Buffer[i] = data[i-1];
  8.     }
  9.     i = i + 1;
  10.    
  11.     while(!I2C1_Open(address));             // sit here until we get the bus..
  12.     I2C1_SetBuffer(Buffer,i);
  13.     I2C1_SetAddressNackCallback(NULL,NULL); //NACK polling?
  14.     I2C1_MasterWrite();
  15.     while(I2C1_BUSY == I2C1_Close());       // sit here until finished.
  16. }

  17. uint8_t I2C_16addr_ByteRead(i2c1_address_t address, uint16_t reg)
  18. {
  19.     uint8_t dat = 0x00;
  20.     uint16_t addr = reg<<8 | reg>>8;
  21.    
  22.     while(!I2C1_Open(address));                               // 打开I2C设备.
  23.     I2C1_SetDataCompleteCallback(rd1RegCompleteHandler,&dat); // 传递数据指针
  24.     I2C1_SetBuffer(&addr,2);                                  // 指定数据地址
  25.     I2C1_SetAddressNackCallback(NULL,NULL);                   // 等待应答
  26.     I2C1_MasterWrite();
  27.     while(I2C1_BUSY == I2C1_Close());                         // 等待操作结束
  28.    
  29.     return dat;
  30. }

  31. void I2C_16addr_BuffRead(i2c1_address_t address,uint16_t reg,uint8_t *data,uint8_t len)
  32. {
  33.     uint16_t addr;
  34.    
  35.     addr = reg<<8 | reg>>8;
  36.    
  37.     i2c1_buffer_t bufferBlock; // result is little endian
  38.     bufferBlock.data = data;
  39.     bufferBlock.len = len;

  40.     while(!I2C1_Open(address)); // sit here until we get the bus..
  41.     I2C1_SetDataCompleteCallback(rdBlkRegCompleteHandler,&bufferBlock);
  42.     I2C1_SetBuffer(&addr,2);
  43.     I2C1_SetAddressNackCallback(NULL,NULL); //NACK polling?
  44.     I2C1_MasterWrite();
  45.     while(I2C1_BUSY == I2C1_Close()); // sit here until finished.
  46.    
  47. }


  48. void I2C_16addr_ByteWrite(i2c1_address_t address,uint16_t reg,uint8_t data)
  49. {
  50.     uint8_t Buffer[3];
  51.     Buffer[0] = reg>>8;
  52.     Buffer[1] = reg;
  53.     Buffer[2] = data;

  54.     while(!I2C1_Open(address));             // 打开I2C器件
  55.     I2C1_SetBuffer(Buffer,3);               // 写入3个字节数据(地址2+数据1)
  56.     I2C1_SetAddressNackCallback(NULL,NULL); // NACK polling?
  57.      I2C1_MasterWrite();
  58.     while(I2C1_BUSY == I2C1_Close());       // 等待写操作完成
  59.    
  60. }


  61. void I2C_16addr_BuffWrite(i2c1_address_t address, uint16_t reg, uint8_t *data, uint8_t len)
  62. {
  63.     uint8_t i,Buffer[20];
  64.     Buffer[0] = reg>>8;                     // 地址高字节
  65.     Buffer[1] = reg;                        // 地址低字节
  66.     for(i=2; i<(len+2); i++){
  67.         Buffer[i] = data[i-2];              // 将要写入的数据依次排列在数组后面
  68.     }
  69.     i = len + 2;
  70.    
  71.     while(!I2C1_Open(address));             // 打开I2C器件
  72.     I2C1_SetBuffer(Buffer,i);               // 写入多个字节数据
  73.     I2C1_SetAddressNackCallback(NULL,NULL); // NACK polling?
  74.     I2C1_MasterWrite();
  75.     while(I2C1_BUSY == I2C1_Close());       // 等待写操作完成
  76. }



    有关I2C测试的过程可参考我的另一个帖子:https://bbs.21ic.com/icview-3138832-1-1.html

    MCC的配置如下,配置RB4为SDA,RB6为SCL:


    下面是DS1307日历模块驱动实验过程的照片:


    这是在显示屏显示的照片:


    这是测试的动画:



    下面是本次测试项目文件的压缩包:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
10299823 发表于 2021-9-4 13:49 | 显示全部楼层
这个是硬件iic吗   
jimmhu 发表于 2021-9-4 13:49 | 显示全部楼层
DS1307可以做万年历吗  
lihuami 发表于 2021-9-4 13:50 | 显示全部楼层
现在配置程序简单多了。   
xiaoyaozt 发表于 2021-9-4 13:50 | 显示全部楼层
这个是直接生成代码吗   
uptown 发表于 2021-9-4 13:51 | 显示全部楼层
有内部带有RTC的芯片吗   
cehuafan 发表于 2021-9-4 13:51 | 显示全部楼层
为什么DS1307的RST在读取数据的时候就需要复位
sesefadou 发表于 2021-9-4 13:51 | 显示全部楼层
CuriosityNano的功能怎么样   
earlmax 发表于 2021-9-4 13:52 | 显示全部楼层
可以使用GPS进行授时的。      
alvpeg 发表于 2021-9-4 13:52 | 显示全部楼层
需要上拉电阻吗?      
primojones 发表于 2021-9-4 13:52 | 显示全部楼层
波特率配置简单多了。      
uptown 发表于 2021-9-4 13:52 | 显示全部楼层
              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

151

主题

1063

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

151

主题

1063

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部