NXP JN5169使用硬件I2C从机收发数据
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从机收发数据相关推荐
- vb6编写dll读取dat文件_【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)...
寻求更好的阅读体验,请移步Mculover666的个人博客: [STM32Cube_15]使用硬件I2C读取温湿度传感器数据(SHT30)www.mculover666.cn 本篇详细的记录了如何使 ...
- 【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)
上一篇:[STM32Cube_14]使用硬件I2C读写环境光强度传感器(BH1750) 寻求更好的阅读体验,请移步:Mculover666的个人博客. 本篇详细的记录了如何使用STM32CubeMX配 ...
- TMS320F28069的硬件I2C一直卡在查询 I2caRegs.I2CSTR.bit.XRDY
项目场景: 使用TMS320F28069的硬件I2C读取MPU6050的数据 问题描述 Uint16 I2CA_ReadBytes( Uint16 SlaveAddress, Uint16 RomAd ...
- STM32F10x_硬件I2C主从通信(轮询发送,中断接收)
推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang Ⅰ.写在前面 ...
- STM8L051的硬件I2C调试
I2C是现代一种极为常见的低速外设通信协议,比起SPI或者UART,它最大的优势应该就是节省芯片管脚了:理论上只要地址够用,多少外设挂I2C总线上都没问题,只占两个管脚.但也因此,I2C的协议就相对复 ...
- NXP JN5169使用定时器进行PWM输出和定时功能
NXP JN5169使用定时器进行PWM输出和定时功能 一.定时器介绍 1.定时器介绍 2.定时器可操作的模式 3.定时器DIO 4.定时器和PWM模式 5.定时器中断 二.实现代码 1.PWM输出 ...
- NXP JN5169 使用看门狗定时器
NXP JN5169 使用看门狗定时器 一.看门狗定时器介绍 二.示例代码 一.看门狗定时器介绍 JN5169 提供了看门狗定时器以防止软件锁定.它通过计算高速 RC 系统时钟(该振荡器运行在 27M ...
- STC8A8K64单片机关于AT24C04基本读写操作(包含硬件I2C与软件模拟I2C)
实验:AT24C04基本读写操作 步骤及现象:在下载程序前,选择stc-isp的IRC频率:12MHz. 程序下载完成后,在串口助手界面,HEX模式下,选择波 特率9600,然后点击"打开串 ...
- nRF52832之硬件I2C
这几天一直在折腾nRF52832的硬件I2C,到了今天终于出现了成果,在此也印证了那句话:"耕耘就有收获" 52832的硬件I2C虽然官方提供了demo,但是自己对I2C通信理解的 ...
- NXP JN5169使用滴答定时器进行精准延时
NXP JN5169使用滴答定时器进行精准延时(us.ms) 一.滴答定时器介绍 二.滴答定时器系统图 1.系统图介绍 2.单次触发模式 3.可重启模式 4.连续运行模式 三.系统时钟 1.系统时钟域 ...
最新文章
- Xilinx Axi Dma Userspace模式下 寄存器 +MMAP 测试程序
- 微软大法好不好,终于要对比了
- ITK:计算图像的最小,最大,方差和均值
- VTK:灯光之SpotLights
- pytorch打印模型参数_Pytorch网络压缩系列教程一:Prune你的模型
- Vue.js(学习Vue3之前必须要掌握的知识)
- php依据地理坐标获取国家、省份、城市,及周边数据类
- 空中照片:云层透过的阳光,双机同飞
- 【数字信号】基于matlab GUI虚拟信号发生器(各种波形)【含Matlab源码 271期】
- Day22——十字链表
- angular4之管道
- OS/操作系统_清华大学(陈渝)笔记目录
- Word中部分内容出现乱码、不显示页码和目录
- 时差怎么理解_英国与中国的时差为什么隔8小时(英国与中国的时差解读)
- Chrome浏览器控制网速
- Keras中那些学习率衰减策略
- OpenJDK源码赏析之三:Java命令参数的读取处理流程
- mac按键难回弹(按下去软软的)
- iwatch 1234 代的区别
- HAUT OJ 1011:圆柱体表面积