Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
I2C_IIC
为什么移植了IIC协议,有数据输出,但是线程会卡死?
发布于 2018-06-14 14:34:58 浏览:1930
订阅该版
* 本帖最后由 aozima 于 2018-6-14 20:24 编辑 * ``` #include "lm75a.h" #include
rt_int32_t swm_get_scl(void *data) { IIC_CLK_IN; return (rt_int32_t)GPIO_GetBit(GPIOB,PIN13); } rt_int32_t swm_get_sda(void *data) { IIC_SDA_IN; return (rt_int32_t)GPIO_GetBit(GPIOC,PIN13); } void swm_set_scl(void *data, rt_int32_t state) { if(state == 1) { IIC_CLK_OUT; IIC_CLK_H; } else if(state == 0) { IIC_CLK_OUT; IIC_CLK_L; } } void swm_set_sda(void *data, rt_int32_t state) { if(state == 1) { IIC_SDA_OUT; IIC_SDA_H; } else if(state == 0) { IIC_SDA_OUT; IIC_SDA_L; } } void swm_udelay(rt_uint32_t us) { uint32_t temp; SysTick->LOAD = 24*us; //24M LOAD¼Ä´æÆ÷Ö»ÓÐ24λ SysTick->CTRL = 0x01; //״̬¼Ä´æÆ÷£¬µ±VALµÄÖµ±»¼õµ½0ʱµÚ16λÖÃ1£¬µÚһλΪ1ʱ¿ªÊ¼¼ÆÊý£¬Îª0ʱֹͣ¼ÆÊý SysTick->VAL = 0; do { temp=SysTick->CTRL; //¶ÁÈ¡µ±Ç°µ¹¼ÆÊýÖµ } while((temp&0x01)&&(!(temp&(1<<16)))); SysTick->CTRL=0; //¹Ø±Õ¼ÆÊýÆ÷ SysTick->VAL=0; //Çå¿Õ¼ÆÊýÆ÷ } static uint8_t Codec_ReadRegister(struct rt_i2c_bus_device * i2c_bus, uint8_t RegisterAddr) { rt_uint16_t flags = 0x00; rt_uint16_t DevAddr = (rt_uint16_t)0x90 >> 1; rt_off_t pos = (rt_off_t)((flags << 16) | DevAddr); rt_uint8_t buffer; buffer = RegisterAddr; rt_device_write(&i2c_bus->parent, pos, &buffer, 1); rt_device_read(&i2c_bus->parent, pos, &buffer, 1); /* Return the byte read from Codec */ return buffer; } static rt_err_t lam75a_init(const char * i2c_bus_name) { struct rt_i2c_bus_device* i2c_bus; uint8_t chip_id; i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(i2c_bus_name); if(i2c_bus == RT_NULL) { rt_kprintf("
i2c_bus %s for cs43l22 not found!
", i2c_bus_name); return -RT_ENOSYS; } /* oflag has no meaning for spi device , so set to RT_NULL */ if(rt_device_open(&i2c_bus->parent, RT_NULL) != RT_EOK) { rt_kprintf("
i2c_bus %s for cs43l22 opened failed!
", i2c_bus_name); return -RT_EEMPTY; } // EVAL_AUDIO_Init(OUTPUT_DEVICE_AUTO, volume, I2S_AudioFreq_48k); /* it must be at the back of EVAL_AUDIO_Init, which reset the cs43l22 */ chip_id = Codec_ReadRegister(i2c_bus, 0x00); rt_kprintf("(chip_id of cs43l22 is 0x%02x)", chip_id); return 0; } static const struct rt_i2c_bit_ops swm_ops = { (void*)0xaa, //no use in set_sda,set_scl,get_sda,get_scl swm_set_sda, swm_set_scl, swm_get_sda, swm_get_scl, swm_udelay, 24, 5, }; int i2c_init(void) { static struct rt_i2c_bus_device swm_i2c; rt_memset((void *)&swm_i2c, 0, sizeof(struct rt_i2c_bus_device)); swm_i2c.priv = (void *)&swm_ops; rt_i2c_bit_add_bus(&swm_i2c, "i2c1"); return 0; }INIT_BOARD_EXPORT(i2c_init); int rt_lm75a_init(void) { //rt_sem_t lm75a; //rt_sem_init(lm75a,"lm75a",1,RT_IPC_FLAG_FIFO); lam75a_init("i2c1"); return 0; }INIT_BOARD_EXPORT(rt_lm75a_init); ``` -------------------------------------------------------------------------------------------- *****一旦在线程调用了rt_lm75a_init()函数,反馈一个值其他线程就卡死了**** -------------------------------------------------------------------------------------------- 出口反馈的信息如下: ----------------------------------------------------- ![1528958046.jpg](https://oss-club.rt-thread.org/uploads/201806/14/143425dldehyf9e6ih6h6g.jpg)
查看更多
3
个回答
默认排序
按发布时间排序
aozima
2018-06-14
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
[i=s] 本帖最后由 aozima 于 2018-6-15 14:01 编辑 [/i] 调I2C最好有逻辑分析仪。
Arion
2018-06-15
这家伙很懒,什么也没写!
>RT-Thread有比较好用的I2C总线以及IO模拟驱动,何不使用现成的圆轮子。 >另外调I2C最好有逻辑分析仪。 ... --- 我时序是对的,因为已经获取到正确数据,只是获取同时线程会卡死,串口出现错误信息
aozima
2018-06-15
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
>INIT_BOARD_EXPORT(i2c_init); >INIT_BOARD_EXPORT(rt_lm75a_init); --- 1. 两者使用同样的导出命令,但有依赖关系,所以运行顺序得不到保证。 一般是按字母顺序排,而不是代码先后顺序。 2. 此时线程还没有启动,所以里面的内容在非线程中运行。 I2C相关的接口只能在线程环境中运行。 把 rt_lm75a_init 改为系统启动之后运行就可以了。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.9k
关于作者
Arion
这家伙很懒,什么也没写!
提问
1
回答
2
被采纳
0
关注TA
发私信
相关问题
1
NXP的I2C应该比ST的好用吧
2
Use of I2C device driver
3
关于I2C 驱动问题请教
4
我如何知道这个iic的io配置和我电路设计的是一致的?
5
I2C模拟读操作失败,不知道问什么进不去读函数
6
RTT的I2C有官方文档资料没有
7
求 STM32F103 IIC 自定义IO初始化 代码
8
报一个LPC4008代码中I2C的bug
9
RTOS IIC总线使用
10
关于在RTT中使用STM32 I2C的疑问
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
在用clangd开发RTT吗,快来试试如何简单获得清晰干净的工作区
2
GD32F450 片内 flash驱动适配
3
STM32H7R7运行CherryUSB
4
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
5
使用RC522软件包驱动FM1722
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
6
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部