NXP JN5169使用硬件I2C从机收发数据

  • 一、JN5169硬件I2C从机端程序
  • 二、STC8F2K08S2硬件I2C主机端程序

JN5169硬件I2C介绍和主机程序:NXP JN5169使用硬件I2C读写BMP085

一、JN5169硬件I2C从机端程序

//i2c地址需要右移一位
#define I2C_SLAVE_ADDRESS   0xA2 >> 1PRIVATE void vCbI2CSlave (uint32 u32Device, uint32 u32ItemBitmap)
{uint8 recv;if(E_AHI_DEVICE_SI == u32Device){     //I2C中断switch(u32ItemBitmap){case E_AHI_SIS_ERROR_MASK:vPutStrs((uint8*)"I2C 协议错误\r\n");break;case E_AHI_SIS_LAST_DATA_MASK:vPutStrs((uint8*)"从 SI 主机接收到的最后的数据字节(数据传输的末尾)\r\n");break;case E_AHI_SIS_DATA_WA_MASK:vPutStrs((uint8*)"数据缓冲区含有来自 SI 主机的数据字节,可以通过 SI 从机读取\r\n");recv = u8AHI_SiSlaveReadData8();vPrintf("收到一个字节数据:%x\n", recv);break;case E_AHI_SIS_DATA_RTKN_MASK:vPutStrs((uint8*)"数据缓冲区中的字节发送到 SI 主机,缓冲区有空位接收下一个字节\r\n");break;case E_AHI_SIS_DATA_RR_MASK:vPutStrs((uint8*)"数据缓冲区需要数据字节发送到 SI 主机\r\n");vAHI_SiSlaveWriteData8(0x88);break;}}
}//i2c从机初始化
PUBLIC void vi2c_slave_init(void)
{/*** 设置i2c从机地址,7+1位地址,关闭脉冲抑制,开启所有中断,流控制NACK*/vAHI_SiSlaveConfigure(I2C_SLAVE_ADDRESS, FALSE, FALSE, 0x1F, FALSE);/*** I2C中断回调函数*/vAHI_SiRegisterCallback(vCbI2CSlave);
}
PUBLIC void AppColdStart (void)
{vAHI_WatchdogStop();(void)u32AHI_Init();vi2c_slave_init();vUartInit();while (1);
}PUBLIC void AppWarmStart (void)
{AppColdStart();
}

串口程序:串口程序
串口格式化输出程序:串口格式化输出

效果演示,主机端发送8个数据到从机端,主机端读取8个数据

二、STC8F2K08S2硬件I2C主机端程序

STC8F2K08S2晶振频率为24MHz

sfr P_SW2 = 0xba;#define I2C_S0 0x10
#define I2C_S1  0x20
#define EAXFR   0x80#define I2CCFG      (*(unsigned char volatile xdata *)0xfe80)
#define I2CMSCR     (*(unsigned char volatile xdata *)0xfe81)
#define I2CMSST     (*(unsigned char volatile xdata *)0xfe82)
#define I2CTXD      (*(unsigned char volatile xdata *)0xfe86)
#define I2CRXD      (*(unsigned char volatile xdata *)0xfe87)sbit SDA = P3^3;
sbit SCL = P3^2;void init_i2c(void)
{uchar temp = 0x00;                            //                                      //切换到第一组I2C
//  temp &= ~(I2C_S0 | I2C_S1);            //I2C_S0=0 I2C_S1=0
//                                      //(P1.5/SCL, P1.4/SDA)//                                        //切换到第二组I2C
//  temp &= ~(I2C_S0 | I2C_S1);            //I2C_S0=1 I2C_S1=0
//  temp |= I2C_S0;                        //(P2.5/SCL, P2.4/SDA)//                                        //切换到第三组I2C
//  temp &= ~(I2C_S0 | I2C_S1);            //I2C_S0=0 I2C_S1=1
//  temp |= I2C_S1;                        //(P7.7/SCL, P7.6/SDA)//切换到第四组I2Ctemp |= (I2C_S0 | I2C_S1);            //I2C_S0=1 I2C_S1=1//(P3.2/SCL, P3.3/SDA)temp |= EAXFR;                      //最高位为1P_SW2 = temp;I2CCFG = 0xE0;                              //使能I2C主机模式I2CMSST = 0x00;
}void wait()
{while(!(I2CMSST & 0x40));I2CMSST &= ~0x40;
}void start()
{I2CMSCR = 0x01;                             //发送START命令wait();
}void send_data(uchar dat)
{I2CTXD = dat;                               //写数据到数据缓冲区I2CMSCR = 0x02;                             //发送SEND命令wait();
}void recv_ack()
{I2CMSCR = 0x03;                             //发送读ACK命令wait();
}uchar recv_data()
{I2CMSCR = 0x04;                             //发送RECV命令wait();return I2CRXD;
}void send_ack()
{I2CMSST = 0x00;                             //设置ACK信号I2CMSCR = 0x05;                             //发送ACK命令wait();
}void send_nack()
{I2CMSST = 0x01;                             //设置NAK信号I2CMSCR = 0x05;                             //发送ACK命令wait();
}void stop()
{I2CMSCR = 0x06;                             //发送STOP命令wait();
}//单字节写入
void Single_Write(uchar SlaveAddress, uchar _data)
{start();                   //起始信号send_data(SlaveAddress);  //发送设备地址+写信号recv_ack();send_data(_data);       //写数据recv_ack();stop();                     //发送停止信号
}//单字节读取
uchar Single_Read(uchar SlaveAddress)
{  uchar _data;start();                          //起始信号send_data(SlaveAddress);           //发送设备地址+写信号recv_ack();start();                          //起始信号send_data(SlaveAddress + 1);         //发送设备地址+读信号recv_ack();_data = recv_data();              //读出数据send_nack();   stop();                           //停止信号return _data;
}//I2C从机地址
#define I2C_ADDRESS     0xA2void main(void)
{uchar i, send[8];init_i2c();for(i = 0; i < 8; i++){send[i] = i + 0x40;}while(1){for(i = 0; i < 8; i++){Single_Write(I2C_ADDRESS, send[i]);Delay500ms();}for(i = 0; i < 8; i++){send[i] = Single_Read(I2C_ADDRESS);Delay500ms();}Delay500ms();Delay500ms();Delay500ms();Delay500ms();}
}

NXP JN5169使用硬件I2C从机收发数据相关推荐

  1. vb6编写dll读取dat文件_【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)...

    寻求更好的阅读体验,请移步Mculover666的个人博客: [STM32Cube_15]使用硬件I2C读取温湿度传感器数据(SHT30)​www.mculover666.cn 本篇详细的记录了如何使 ...

  2. 【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)

    上一篇:[STM32Cube_14]使用硬件I2C读写环境光强度传感器(BH1750) 寻求更好的阅读体验,请移步:Mculover666的个人博客. 本篇详细的记录了如何使用STM32CubeMX配 ...

  3. TMS320F28069的硬件I2C一直卡在查询 I2caRegs.I2CSTR.bit.XRDY

    项目场景: 使用TMS320F28069的硬件I2C读取MPU6050的数据 问题描述 Uint16 I2CA_ReadBytes( Uint16 SlaveAddress, Uint16 RomAd ...

  4. STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

    推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang Ⅰ.写在前面 ...

  5. STM8L051的硬件I2C调试

    I2C是现代一种极为常见的低速外设通信协议,比起SPI或者UART,它最大的优势应该就是节省芯片管脚了:理论上只要地址够用,多少外设挂I2C总线上都没问题,只占两个管脚.但也因此,I2C的协议就相对复 ...

  6. NXP JN5169使用定时器进行PWM输出和定时功能

    NXP JN5169使用定时器进行PWM输出和定时功能 一.定时器介绍 1.定时器介绍 2.定时器可操作的模式 3.定时器DIO 4.定时器和PWM模式 5.定时器中断 二.实现代码 1.PWM输出 ...

  7. NXP JN5169 使用看门狗定时器

    NXP JN5169 使用看门狗定时器 一.看门狗定时器介绍 二.示例代码 一.看门狗定时器介绍 JN5169 提供了看门狗定时器以防止软件锁定.它通过计算高速 RC 系统时钟(该振荡器运行在 27M ...

  8. STC8A8K64单片机关于AT24C04基本读写操作(包含硬件I2C与软件模拟I2C)

    实验:AT24C04基本读写操作 步骤及现象:在下载程序前,选择stc-isp的IRC频率:12MHz. 程序下载完成后,在串口助手界面,HEX模式下,选择波 特率9600,然后点击"打开串 ...

  9. nRF52832之硬件I2C

    这几天一直在折腾nRF52832的硬件I2C,到了今天终于出现了成果,在此也印证了那句话:"耕耘就有收获" 52832的硬件I2C虽然官方提供了demo,但是自己对I2C通信理解的 ...

  10. NXP JN5169使用滴答定时器进行精准延时

    NXP JN5169使用滴答定时器进行精准延时(us.ms) 一.滴答定时器介绍 二.滴答定时器系统图 1.系统图介绍 2.单次触发模式 3.可重启模式 4.连续运行模式 三.系统时钟 1.系统时钟域 ...

最新文章

  1. Xilinx Axi Dma Userspace模式下 寄存器 +MMAP 测试程序
  2. 微软大法好不好,终于要对比了
  3. ITK:计算图像的最小,最大,方差和均值
  4. VTK:灯光之SpotLights
  5. pytorch打印模型参数_Pytorch网络压缩系列教程一:Prune你的模型
  6. Vue.js(学习Vue3之前必须要掌握的知识)
  7. php依据地理坐标获取国家、省份、城市,及周边数据类
  8. 空中照片:云层透过的阳光,双机同飞
  9. 【数字信号】基于matlab GUI虚拟信号发生器(各种波形)【含Matlab源码 271期】
  10. Day22——十字链表
  11. angular4之管道
  12. OS/操作系统_清华大学(陈渝)笔记目录
  13. Word中部分内容出现乱码、不显示页码和目录
  14. 时差怎么理解_英国与中国的时差为什么隔8小时(英国与中国的时差解读)
  15. Chrome浏览器控制网速
  16. Keras中那些学习率衰减策略
  17. OpenJDK源码赏析之三:Java命令参数的读取处理流程
  18. mac按键难回弹(按下去软软的)
  19. iwatch 1234 代的区别
  20. HAUT OJ 1011:圆柱体表面积

热门文章

  1. Word2Vec模型之实现篇
  2. python-函数-圆形生成器
  3. R如何读取txt文件
  4. 智能语言处理之依存树计算句子结构相似度计算
  5. 下拉列表dropdown取消默认点击隐藏及修复需要二次点击的方法
  6. 较强冷空气影响中东部地区 江南华南等地有小到中雨
  7. 脑电伪迹降噪方法整理
  8. eclipse的代码突然变成红色块或绿色块
  9. 正弦函数的频谱图matlab,怎样用MATLAB画正弦函数以及怎样看频谱图?
  10. 奇舞周刊第 444 期:浅谈文档的实时协同编辑