野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11315|回复: 7

提问,有一种单线双向传输的传感器,通过维持高电平的时间传输1与0

[复制链接]
发表于 2019-3-20 21:29:59 | 显示全部楼层 |阅读模式
该传感器是通过单数据线,接上拉电阻到VCC。
时序图如下


我的想法是,通过定义一个GPIO口,并使能其下降沿中断,当产生中断后,在中断子程序中延时120us,测量GPIO的电平,如果仍然为高电平则为1,如果为低电平则为0.可是,这需要我在中断中还能响应GPIO口的中断。。。好像并不可以,实在找不出来可以检测高电平长短的方法,希望在这里得到大家的帮助。谢谢前辈们。
2.png
3.png
1.png

ZS03.pdf

1.01 MB, 下载次数: 10

DATASHEET

回复

使用道具 举报

 楼主| 发表于 2019-3-20 21:34:08 | 显示全部楼层
我又想了一下,如果我改为上升沿中断,并且在中断子程序中延时28+us的话,倒是真的可以通过检测GPIO口高地电平的方法来确定传感器传输回的数据。可是,这种中断方式我无法确定到底是最开始,传感器回应主机拉高的响应还是真的给了数据1。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-20 21:45:38 | 显示全部楼层
这是我目前写的不对的中断子程序
void EXTI_IRQHandler(void)
{
        //确保产生中断
        if (EXTI_GetITStatus(EXTI_Line12)!= RESET )
        {
               
                recvStat++;
                ZS03_DATA <<= 1;
                ZS03_DATA %= 0xfffe;
                SysTick_Delay_us(5);//90us
                if (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12)==SET)
                {
                        ZS03_DATA |= 0x0001;
                }
        }
               
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-20 21:50:44 | 显示全部楼层
Douzen 发表于 2019-3-20 21:45
这是我目前写的不对的中断子程序
void EXTI_IRQHandler(void)
{

recvStat是一个标志物变量,他的值是枚举类型从Data_0_bit到Data_31_bit//数据位另外加Data_Stop_bit、、停止位
这个中断程序就无法分辨出传感器第一次回应产生的80us高电平,如果通过电平的长短,那80us和70us的间隙太短了,我根本无法通过延时程序准确地在70us后80us前判断GPIO口的电平,所以无法分辨。
回复 支持 反对

使用道具 举报

发表于 2019-3-21 08:41:33 | 显示全部楼层
个人建议:我觉得你不应该用中断方式来读取,它这单总线时序上要求比较严格,你只要严格按照他的要求,拉高拉低多长时间,等待多长时间,判断是否是正常状态,然后读取数据就可以了,这样比较简单点。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-21 12:33:42 | 显示全部楼层
东来东往 发表于 2019-3-21 08:41
个人建议:我觉得你不应该用中断方式来读取,它这单总线时序上要求比较严格,你只要严格按照他的要求,拉高 ...

嗯嗯嗯 最初我也是没有用中断。但是不用中断的话,首先我用主机拉低至少18ms后拉高30us,告诉传感器主机要读数,然后传感器拉低电平响应80us后拉高80us,开始传输数据。即便 我可以准确延时到开始传输第一位数据时刻读取IO口。我也无法判断到底是1还是0(因为传感器是通过高电平的时间来区分1,0),我只能通过延时到78us到120us之间读取GPIO口电平高低来判断1,0。但是比较蛋疼的是,如果我如此延时,就会和下一个数据错位。比如说 传感器传给我八个1.一共用时(8*(50+70))us,如果传感器传给我八个0.一共用时(8*(50+28))us。这样会有一个很大的时间差。我不知如何通过软件消除这个时间差。从而让我每次IO口检测的电平都是在“下一bit开始”后78us到120us之间。虚心求教,感谢您的回复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-21 12:34:39 | 显示全部楼层
Douzen 发表于 2019-3-21 12:33
嗯嗯嗯 最初我也是没有用中断。但是不用中断的话,首先我用主机拉低至少18ms后拉高30us,告诉传感器主机 ...

使用中断,至少可以让传感器每次传输数据时,刷新我延时的基点。也就是每次数据都从上升沿开始计时
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-21 12:39:01 | 显示全部楼层
@fire 召唤大佬
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 06:42 , Processed in 0.030733 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表