火龙果(redpitaya)开发板常用接口C语言开发指南(十三)——IIC通信连接数字罗盘(本部分完结)

火龙果(redpitaya)开发板常用接口C语言开发指南(十三)——IIC通信连接数字罗盘(本部分完结)


——本人为《火龙果实战指南——搭建基于Zynq处理器的测量仪器与创新实践平台》一书的作者之一,为了便于各位快速上手火龙果开发板,现提供部分实战指南,包含环境配置、源码、效果等,供大家学习交流使用。

上一节介绍了通过IIC读取EEPROM的操作,但在在实际的工程应用中,开发者们除了在EEPROM中读取数据,更多的情况是需要从IIC总线下挂载的传感器上面读取数据供系统使用,上一节已经介绍过通过IIC操作EEPROM,本节将介绍常用的从red pitaya提供的IIC接口,从外部传感器上读取数据。便于读者今后实际的工程运用。
查阅red pitaya接口示意图(如图1所示),找到red pitaya扩展口E2的IIC接口。
在这里插入图片描述
图1 red pitaya扩展口示意图

传感器采用HMC5883L 3轴数字罗盘(如图2所示),HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进的高分辨率HMC118X系列磁阻传感器,并附带专利的集成电路包括放大器、自动消磁驱动器、偏差校准、能使罗盘精度控制在1°~2°的12位模数转换器.简易的I2C 系列总线接口。本教程通过在传感器上方放置金属物品的方法改变传感器的状态,并从串口打印出此时传感器的输出。
在这里插入图片描述
图2 HMC5883L 3轴数字罗盘
连接开发板并在项目文件夹redpitaya下创建GeomagnetismIIC.c文件,写入如下代码

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <linux/ioctl.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <stdint.h>
#define I2C_SLAVE_FORCE 		   0x0706
#define I2C_SLAVE    			   0x0703   
#define I2C_FUNCS    			   0x0705    
#define I2C_RDWR    			   0x0707   
#define EEPROM_ADDR            	   0x3c
#define PAGESIZE                   32
#define EEPROMSIZE                 64*1024/8
int fd; 
int main(int argc, char *argv[])
{
    int status;
	char *buffer = (char *)malloc(EEPROMSIZE * sizeof(char))unsigned char a1[] = {20x00}unsigned char recbuff[6]int offset = 0x100;
	ssize_t bytes_written;
    ssize_t bytes_read;
    fd = open("/dev/i2c-0", O_RDWR)if(fd < 0)
    {
        printf("Cannot open the IIC device\n")return 1}
    status = ioctl(fd, I2C_SLAVE, EEPROM_ADDR>>1)if(status < 0)
    {
        printf("Unable to set the IIC address\n")return -1}
	 bytes_written = write(fd,a1,2)if(bytes_written < 0){
         fprintf(stderr" write address error.\n")return -1}
    a1[0] = 0x03while(1)
	{
		int i=5000000int j=5000000write(fd,a1,1);
		bytes_read = read(fd, recbuff, 6)if(bytes_read < 0){
			fprintf(stderr"read error.\n")return -1}
printf("%d %d %d %d %d %d\n",recbuff[0],recbuff[1],recbuff[2],recbuff[3],recbuff[4],recbuff[5])while(i--){} 
		while(j--){}
	}
    close(fd)free(buffer)return 0}

参考命令:

cd /hmoe/GeomagnetismIIC
gcc –o GeomagnetismIIC GeomagnetismIIC.c
./ GeomagnetismIIC

通过程序的运行,我们可以看到左边传感器竖直向上放置的时候,IIC输出第一位为0(如图3所示),而当金属物品放置于传感器上方时,第一位变为255(如图4所示),变化明显,成功探测到传感器上方的金属物品。
在这里插入图片描述
图3 未探测到金属物品时输出
在这里插入图片描述
图4 探测到金属物品时输出

由此不难看出,Linux下操作IIC串口都是很方便的文件操作,能很方便的实现开发者需求的功能,由于SPI的操作与IIC类似,本教程不再详细介绍,串口、IIC、SPI以及makefile相关的源码都放在了资源里。留予读者自行学习。

至此,火龙果(redpitaya)开发板常用接口C语言开发指南告一段落,后续其他的教程也会对火龙果其他开发方式以及应用场景作详细的介绍与讲解,敬请期待,如果您喜欢我的教程,还请各位看官老爷帮我点个赞,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_38470434/article/details/106035234