stm32与Linux.通信,linux下编写I2C驱动与stm32通信(二)

#include"gpioi2c_ex.h"

#include"I2C_driver.h"

static int fd = -1;

//打开设备文件

int I2C_Open()

{

fd = open("/dev/gpioi2c_ex",O_RDWR);

if (fd<0)

{

printf("Open gpioi2c_ex deverror!n");

return -1;

}

return 0;

}

//关闭设备

int I2C_Close()

{

close(fd);

return 0;

}

//从stm32获取罗盘数据

int I2C_GetLooppad(short*yam,short *pitch,short *roll)

{

int ret;

I2C_DATA_S  i2c_data ;

unsigned int device_addr=0x30,reg_addr=0x0, reg_addr_end=0x0, reg_value[3];

unsigned int reg_width = 1, data_width = 2;

int cur_addr;

for(reg_addr=0x01,reg_addr_end=0x01;reg_addr<0x04;reg_addr++,reg_addr_end++)

{

for (cur_addr = reg_addr; cur_addr< reg_addr_end + 1; cur_addr ++)

{

i2c_data.dev_addr = device_addr ;

i2c_data.reg_addr = cur_addr    ;

i2c_data.addr_byte_num   = reg_width ;

i2c_data.data_byte_num   = data_width ;

ret = ioctl(fd, GPIO_I2C_READ,&i2c_data);

reg_value[cur_addr-1] =  i2c_data.data ;

printf("0x%x 0x%xn",cur_addr, reg_value[cur_addr-1]);

}

}

*yam = (short)reg_value[0];

*pitch = (short)reg_value[1];

*roll = (short)reg_value[2];

returnret;

}

//设置LED亮度,将亮度值传给stm32

intI2C_SetLed(unsigned char light)

{

int ret;

I2C_DATA_S  i2c_data ;

unsigned int reg_width = 0,data_width = 2;

unsigned int device_addr = 0x30,reg_addr = 0, reg_value = 0x0400+light;

i2c_data.dev_addr = device_addr ;

i2c_data.reg_addr= reg_addr    ;

i2c_data.addr_byte_num= reg_width  ;

i2c_data.data     = reg_value         ;

i2c_data.data_byte_num= data_width ;

ret= ioctl(fd, GPIO_I2C_WRITE, &i2c_data);

return ret;

}

测试代码如下:

#include#include#include#include #include#include#include#include"gpioi2c_ex.h"

#include"I2C_driver.h"

int main()

{

short i = 0,yam,pitch,roll;

int ret;

ret = I2C_Open();

ret =I2C_GetLooppad(&yam,&pitch,&roll);

ret = I2C_SetLed(0x60);

printf("yam=%d,pitch=%d,roll=%dn",yam,pitch,roll);

ret = I2C_Close();

return 0;

}

实际测试中发送,从stm32获取数据的过程十分迅速,并且无乱码;但是当hi3518e给stm32写数据的时候,发现stm32会卡死在I2c中断中,无法跑回主函数,十分不解。由于采用的硬件I2c中断并且工作在从模式下,对于这种现象不知怎样下手,从现象来看,猜测应该是stm32的i2c中断被触发了之后,一直在等待主机的某个ACK或者是停止命令,于是重新去看了GPIO模拟i2c的驱动源文件代码,发现在write函数中发送完数据后等待从机的ACK的语句被注释掉了,没有等待从机ACK就直接发送了stop命令,而read函数中接收完数据都先回复NACK在发送stop命令,于是加上该语句,解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值