Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
I2C_IIC
为什么移植了IIC协议,有数据输出,但是线程会卡死?
发布于 2018-06-14 14:34:58 浏览:1963
订阅该版
* 本帖最后由 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()函数,反馈一个值其他线程就卡死了**** -------------------------------------------------------------------------------------------- 出口反馈的信息如下: ----------------------------------------------------- 
查看更多
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
被浏览
2k
关于作者
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
ART-Pi2移植CMSIS-DAP(基于CherryUSB协议栈)
2
RT-thred的stm32h723对应bsp包CubeMX添加其他外设报错
3
RT-Thread中的time溢出问题,时间戳溢出,解决方法
4
ART-PI使用env驱动ETH网卡,pc和板子可以ping通
5
SystemView线程名字不显示
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
9
个答案
2
次被采纳
xiaorui
3
个答案
2
次被采纳
winfeng
2
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
本月文章贡献
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
lizimu
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部