搜索
bottom↓
回复: 19

做一款无线教鞭

[复制链接]

出0入0汤圆

发表于 2012-5-14 22:25:49 | 显示全部楼层 |阅读模式
最近总是接触课件,
突发奇想做个无线教鞭,
通过USB控制电脑上PPT文件的全屏、翻页等功能,
有做过的兄弟吗?
给点建议呗。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入8汤圆

发表于 2012-5-14 22:37:32 | 显示全部楼层
还不如买个现成的呢,不值得折腾

出0入169汤圆

发表于 2012-5-14 22:40:22 | 显示全部楼层
很常见了,楼主的老师都没用过么?

出110入0汤圆

发表于 2012-5-14 22:40:27 | 显示全部楼层
现成的很便宜了,也很好使

出0入0汤圆

发表于 2012-5-14 22:41:42 | 显示全部楼层
我做了一个,手持端用mega8和nRF2401,有两个键A、B,电脑端用mcs51,nRF2401和ch372 USB通信,上位机用C#开进程读取USB信息,按下A键时触发一个Windows P键按键事件,按下B键时触发一个Windows N键按键事件。

出0入0汤圆

发表于 2012-5-14 22:46:42 | 显示全部楼层
电子白板吧?

出0入169汤圆

发表于 2012-5-14 23:51:01 | 显示全部楼层
用avr模拟一个hid键盘很好用,免驱的。

我刚刚做好一个模型,稳定性还不是很好。

出0入0汤圆

 楼主| 发表于 2012-5-15 08:51:22 | 显示全部楼层
lxvtag 发表于 2012-5-14 23:51
用avr模拟一个hid键盘很好用,免驱的。

我刚刚做好一个模型,稳定性还不是很好。 ...

我用51的,能说具体点吗?最好能分享资料。
能站在巨人的肩上,是我最大的幸福。
呵呵!

出0入0汤圆

发表于 2012-5-15 09:26:02 | 显示全部楼层
有现成的,便宜也稳定。

出0入0汤圆

 楼主| 发表于 2012-5-15 09:48:41 | 显示全部楼层
小燕子神飞 发表于 2012-5-14 22:41
我做了一个,手持端用mega8和nRF2401,有两个键A、B,电脑端用mcs51,nRF2401和ch372 USB通信,上位机用C# ...

楼主可以提供全部资料吗?
站在巨人的肩上将看的更远.

出0入0汤圆

 楼主| 发表于 2012-5-15 09:50:09 | 显示全部楼层
我之前用的功能不全,所以想开发一款功能更强大的。
再说了,咱玩单片机的不就是喜欢折腾吗?

出0入0汤圆

 楼主| 发表于 2012-5-16 10:59:03 | 显示全部楼层
决定采用“小燕子神飞”的方案,nRF2401+ch372+51单片机,正在研究资料。
谢谢各位的热心参与。
特别谢谢 “小燕子神飞”的方案。

出0入0汤圆

 楼主| 发表于 2012-5-16 10:59:42 | 显示全部楼层
horalxi 发表于 2012-5-15 09:48
楼主可以提供全部资料吗?
站在巨人的肩上将看的更远.

决定采用您的方案,正在研究资料。
还是希望楼主能提供点资料。

出0入0汤圆

发表于 2012-5-16 12:36:01 | 显示全部楼层
可以留个位置我也站站么

出0入0汤圆

发表于 2012-6-3 14:30:52 | 显示全部楼层
PDF资料可以网上找找,但是程序是用我自己杜撰的编程语言写的,呵呵。

======================================================
这是插在电脑USB上的接收板程序:


ACI cpu = ACI cputype mcs51,
ACI 启动 -> 引擎 启动,

导入 组件库 mcs c51 chip,
导入 组件库 software time mcs_24mhz time,

指示灯 定时器 -> 定时器,
导入 组件库 hardware start mcs51 led,

无线收发器 芯片 -> chip,
无线收发器 组件
{
        public link 接口 组件 {} -> nrf2401,
        public link 芯片 组件 {}
       
        nrf2401 CE_port -> 配置器 CE_port,
        nrf2401 IRQ_pin -> 配置器 IRQ_pin,
        nrf2401 CSN_port -> 配置器 CSN_port,
        nrf2401 spi SCK_port -> 配置器 SCK_port,
        nrf2401 spi MISO_pin -> 配置器 MISO_pin,
        nrf2401 spi MOSI_port -> 配置器 MOSI_port,
       
        配置器 芯片 -> 芯片,
        配置器 组件
        {
                public link 芯片 组件 {}
               
                link CE_port(N1) = 芯片 P1 3,
                link IRQ_pin(N1) = 芯片 P1 2,
                link CSN_port(N1) = 芯片 P3 0,
                link SCK_port(N1) = 芯片 P1 0,
                link MISO_pin(N1) = 芯片 P3 1,
                link MOSI_port(N1) = 芯片 P1 1,
        }
        导入 组件库 hardware nrf2401 mcs nrf2401,
}

CH372 定时器 -> 定时器,
CH372 芯片 -> chip,
CH372 组件
{
        public link 接口 组件 {} -> CH372,
        public link 定时器 组件 {}
        public link 芯片 组件 {}
       
        CH372 DATA_port -> 配置器 DATA_port,
        CH372 INT_port -> 配置器 INT_port,
        CH372 WR_port -> 配置器 WR_port,
        CH372 RD_port -> 配置器 RD_port,
        CH372 A0_port -> 配置器 A0_port,
       
        配置器 芯片 -> 芯片,
        配置器 组件
        {
                public link 芯片 组件 {}
               
                link DATA_port(N8) = 芯片 P0,
                link INT_port(N1) = 芯片 P2 7,
                link WR_port(N1) = 芯片 P2 6,
                link RD_port(N1) = 芯片 P2 5,
                link A0_port(N1) = 芯片 P2 4,
        }
        CH372 定时器 -> 定时器,
        导入 组件库 hardware ch372 mcs ch372,
}

//*******************************************************
引擎 指示灯 -> 指示灯,
引擎 定时器 -> 定时器,
引擎 USB控制器 -> CH372 接口,
引擎 无线收发器 -> 无线收发器 接口,

引擎 组件
{
        public link 指示灯 组件 {}
        public link 定时器 组件 {}
        public link USB控制器 组件 {}
        public link 无线收发器 组件 {}
       
        public void 启动()
        {
                指示灯 初始化[],
                指示灯 闪烁[ 3 ],
               
                USB控制器 初始化[],
                如果 !USB控制器 设置工作模式成功[ 2 ], 指示灯 闪烁[ 100 ].
                USB控制器 设置超时时间[ 200 ],
               
                无线收发器 初始化[],
                如果 !无线收发器 工作正常[], 指示灯 闪烁[ 100 ].
                无线收发器 设置超时时间[ 200 ],
                无线收发器 本机地址 0 = 0,
                无线收发器 本机地址 1 = 0x43,
                无线收发器 本机地址 2 = 0x10,
                无线收发器 本机地址 3 = 0x10,
                无线收发器 本机地址 4 = 0x01,
               
                对方地址 0 = 27,
                对方地址 1 = 0x43,
                对方地址 2 = 0x10,
                对方地址 3 = 0x10,
                对方地址 4 = 0x01,
               
                反复执行
                        //无线收发器 设置为发射模式[],
                        //无线收发器 发射数据[ 数据区, 8, 对方地址 ],
                       
                        无线收发器 设置为接收模式[],
                        反复执行 直到 无线收发器 接收到数据[ 数据区, 1, true ], ...
                        USB控制器 发送数据 [ 数据区, 1 ],
                        指示灯 闪烁[ 1 ],
                        ...
        }
        对方地址([N8*5]),
        数据区([N8*8]),
}

===========================================
这个是手持端程序



ACI cpu = ACI cputype mega8,
ACI 启动 -> 引擎 启动,

导入 组件库 avr mega8 chip,

导入 组件库 software time avr_12mhz time,

无线收发器 芯片 -> chip,
无线收发器 组件
{
        public link 接口 组件 {} -> nrf2401,
        public link 芯片 组件 {}
       
        nrf2401 CE_ddr -> 配置器 CE_ddr,
        nrf2401 CE_port -> 配置器 CE_port,
        nrf2401 IRQ_ddr -> 配置器 IRQ_ddr,
        nrf2401 IRQ_pin -> 配置器 IRQ_pin,
        nrf2401 CSN_ddr -> 配置器 CSN_ddr,
        nrf2401 CSN_port -> 配置器 CSN_port,
        nrf2401 spi SCK_ddr -> 配置器 SCK_ddr,
        nrf2401 spi SCK_port -> 配置器 SCK_port,
        nrf2401 spi MISO_ddr -> 配置器 MISO_ddr,
        nrf2401 spi MISO_pin -> 配置器 MISO_pin,
        nrf2401 spi MOSI_ddr -> 配置器 MOSI_ddr,
        nrf2401 spi MOSI_port -> 配置器 MOSI_port,
       
        配置器 芯片 -> 芯片,
        配置器 组件
        {
                public link 芯片 组件 {}
               
                link CE_ddr(N1) = 芯片 DDRD 5,
                link CE_port(N1) = 芯片 PORTD 5,
                link IRQ_ddr(N1) = 芯片 DDRB 0,
                link IRQ_pin(N1) = 芯片 PINB 0,
                link CSN_ddr(N1) = 芯片 DDRB 2,
                link CSN_port(N1) = 芯片 PORTB 2,
                link SCK_ddr(N1) = 芯片 DDRD 6,
                link SCK_port(N1) = 芯片 PORTD 6,
                link MISO_ddr(N1) = 芯片 DDRD 7,
                link MISO_pin(N1) = 芯片 PIND 7,
                link MOSI_ddr(N1) = 芯片 DDRB 1,
                link MOSI_port(N1) = 芯片 PORTB 1,
        }
        导入 组件库 hardware nrf2401 avr nrf2401,
}
指示灯 定时器 -> 定时器,
public 指示灯 组件
{
        public link 定时器 组件 {}
       
        public void 初始化()
        {
                定时器 延时10毫秒[ 50 ],
               
                OUT_DDR = 1,
                OUT_PORT = 0,
        }
        public void 点亮()
        {
                OUT_PORT = 1,
        }
        public void 熄灭()
        {
                OUT_PORT = 0,
        }
        public void 闪烁( (N8)time )
        {
                反复执行 time 次,
                        OUT_PORT = 1,
                        定时器 延时10毫秒[ 5 ],
                        OUT_PORT = 0,
                        定时器 延时10毫秒[ 10 ],
                        ...
        }
        link OUT_PORT(N1) = ACI Wind chip PORTD 3,
        link OUT_DDR(N1) = ACI Wind chip DDRD 3,
}
//*******************************************************
键盘 芯片 -> chip,

键盘 组件
{
        public link 芯片 组件 {}
       
        void 初始化()
        {
                KEY1_ddr = 1,
                KEY1_port = 1,
                KEY2_ddr = 1,
                KEY2_port = 1,
        }
        (T) 按键1按下()
        {
                返回 KEY1_pin == 0,
        }
        (T) 按键2按下()
        {
                返回 KEY2_pin == 0,
        }
        link KEY1_port(N1) = 芯片 PORTB 5,
        link KEY1_ddr(N1) = 芯片 DDRB 5,
        link KEY1_pin(N1) = 芯片 PINB 5,
        link KEY2_port(N1) = 芯片 PORTB 4,
        link KEY2_ddr(N1) = 芯片 DDRB 4,
        link KEY2_pin(N1) = 芯片 PINB 4,
}
//*******************************************************
蜂鸣器 芯片 -> chip,
蜂鸣器 定时器 -> 定时器,

蜂鸣器 组件
{
        public link 芯片 组件 {}
        public link 定时器 组件 {}
       
        void 初始化()
        {
                PORT_ddr = 1,
                PORT = 0,
        }
        public void 嘀嘀响( (N8)n )
        {
                反复执行 n 次,
                        嘀响[],
                        定时器 延时100毫秒[ 1 ],
                        ...
        }
        void 嘀响()
        {
                反复执行 200 次,
                        PORT = 1,
                        延时1毫秒[],
                        PORT = 0,
                        延时1毫秒[],
                        ...
        }
        void 延时1毫秒()
        {
                反复执行 20 次,
                        反复执行 10 次, ...
                        ...
        }
        link PORT(N1) = 芯片 PORTC 5,
        link PORT_ddr(N1) = 芯片 DDRC 5,
}
//*******************************************************
引擎 指示灯 -> 指示灯,
引擎 定时器 -> 定时器,
引擎 蜂鸣器 -> 蜂鸣器,
引擎 键盘 -> 键盘,
引擎 无线收发器 -> 无线收发器 接口,

引擎 组件
{
        public link 指示灯 组件 {}
        public link 定时器 组件 {}
        public link 蜂鸣器 组件 {}
        public link 键盘 组件 {}
        public link 无线收发器 组件 {}
       
        public void 启动()
        {
                指示灯 初始化[],
                蜂鸣器 初始化[],
                键盘 初始化[],
               
                无线收发器 初始化[],
                如果 !无线收发器 工作正常[], 指示灯 闪烁[ 100 ].
                无线收发器 设置超时时间[ 200 ],
                无线收发器 本机地址 0 = 27,
                无线收发器 本机地址 1 = 0x43,
                无线收发器 本机地址 2 = 0x10,
                无线收发器 本机地址 3 = 0x10,
                无线收发器 本机地址 4 = 0x01,
               
                对方地址 0 = 0,
                对方地址 1 = 0x43,
                对方地址 2 = 0x10,
                对方地址 3 = 0x10,
                对方地址 4 = 0x01,
               
                指示灯 闪烁[ 3 ],
                蜂鸣器 嘀嘀响[ 3 ],
               
                按键1上次按下(T) = false,
                按键2上次按下(T) = false,
                反复执行
                        有键按下(T) = false,
                       
                        按键1本次按下(T) = 键盘 按键1按下[],
                        按键2本次按下(T) = 键盘 按键2按下[],
                       
                        如果 按键1本次按下 && !按键1上次按下,
                                数据区 0 = 1,
                                有键按下 = true.
                       
                        如果 按键2本次按下 && !按键2上次按下,
                                数据区 0 = 2,
                                有键按下 = true.
                       
                        按键1上次按下 = 按键1本次按下,
                        按键2上次按下 = 按键2本次按下,
                       
                        如果 有键按下,
                                无线收发器 设置为发射模式[],
                                无线收发器 发射数据[ 数据区, 1, 对方地址 ],
                                无线收发器 设置为接收模式[],
                                蜂鸣器 嘀嘀响[ 1 ],
                                指示灯 闪烁[ 1 ].
                       
                        如果 无线收发器 接收到数据[ 数据区, 8, true ],
                                蜂鸣器 嘀嘀响[ 数据区 0 ].
                        ...
        }
        对方地址([N8*5]),
        数据区([N8*8]),
}











出0入0汤圆

发表于 2012-6-3 14:33:09 | 显示全部楼层
这是CH372驱动文件:



//********************************************
//类型:                CH372元件
//单片机:                MCS
//晶振:                24MHz

CH372 组件
{
        公开 link 定时器 组件 {}
       
        link 虚拟类型 BASE {} -> ACI Cloud base,
       
        set_timeout(N16),
       
        GET_IC_VER(N8) =                ACI const 0x01,
        ENTER_SLEEP(N8) =                ACI const 0x03,
        RESET_ALL(N8) =                ACI const 0x05,
        CHECK_EXIST(N8) =                ACI const 0x06,
        CHK_SUSPEND(N8) =                ACI const 0x0b,
        SET_USB_ID(N8) =                ACI const 0x12,
        SET_USB_MODE(N8) =        ACI const 0x15,
        GET_STATUS(N8) =                ACI const 0x22,
        UNLOCK_USB(N8) =                ACI const 0x23,
        READ_DATA(N8) =                ACI const 0x27,
        READ_DATA_UNLOCK(N8) =        ACI const 0x28,
        WRITE_DATA1(N8) =                ACI const 0x2a,
        WRITE_DATA2(N8) =                ACI const 0x2b,
       
        引擎(公开)
        初始化
        {
                端口初始化[],
               
                //发送CH372硬件复位命令
                写命令[ RESET_ALL ],
                定时器 延时10毫秒[ 10 ],
        }
        引擎()
        端口初始化
        {
                DATA_port = 0xff,
               
                WR_port = 1,
                RD_port = 1,
                A0_port = 1,
                INT_port = 1,
        }
        引擎(公开)
        mode_index(N8),
        设置工作模式成功(T)
        {
                //设置CH372工作在模式-mode_index
                写命令[ 0x15 ],
                写数据[ mode_index ],
                定时器 延时10毫秒[ 1 ],
               
                //判断模式设置是否成功
                如果 读数据[] != 0x51,
                        返回 false,
                否则
                        返回 true.
        }
        引擎(公开)
        t(N16),
        设置超时时间
        {
                set_timeout = t,
        }
        引擎(公开)
        Buf([N8*?]), length(N8),
        发送数据
        {
                写命令[ WRITE_DATA2 ],
                写数据[ length ],
               
                反复执行 length 次,初始 i(N8) = 0,每次 i + 1,
                        写数据[ Buf i ],
                        ...
               
                反复执行 直到 INT_port == 0, ...
                写命令[ GET_STATUS ],
                d0(N8) = 读数据[],
                写命令[ UNLOCK_USB ],
        }
        引擎(公开)
        Buf([N8*?]), length(BASE N8), is_timeout(T),
        接收到数据(T)
        {
                timeout(N16) = 0,
                //等待USB命令
                反复执行 直到 INT_port == 0,
                        如果 is_timeout,
                                如果 timeout == set_timeout, 返回 false.
                                timeout + 1,
                                ...
                        ...
               
                写命令[ GET_STATUS ],
                temp(N8) = 读数据[],
               
                写命令[ READ_DATA ],
                length = 读数据[],
               
                反复执行 length 次,初始 i(N8) = 0, 每次 i + 1,
                        Buf i = 读数据[],
                        ...
                       
                写命令[ UNLOCK_USB ],
                返回 true,
        }
        引擎()
        cmd(N8),
        写命令
        {
                #asm "nop"
                #asm "nop"
                DATA_port = cmd,
                A0_port = 1,
                WR_port = 0,
                WR_port = 1,
        }
        引擎()
        data(N8),
        写数据
        {
                #asm "nop"
                #asm "nop"
                DATA_port = data,
                A0_port = 0,
                WR_port = 0,
                WR_port = 1,
        }
        引擎()
        读数据(N8)
        {
                DATA_port = 0xff,
                A0_port = 0,
                RD_port = 0,
                data(N8) = DATA_port,
                RD_port = 1,
                返回 data,
        }
        公开 link DATA_port(N8),
        公开 link INT_port(N1),
        公开 link WR_port(N1),
        公开 link RD_port(N1),
        公开 link A0_port(N1),
}


出0入0汤圆

发表于 2012-6-3 14:34:04 | 显示全部楼层
NRF2401的驱动文件:




//无线通信模块nrf2401
//版本:        在版本v0中固定发送4个字节数据,这个版本改成了9个数据;
//                可以设置超时时间;
//芯片:        AVR芯片

nrf2401 组件
{
        CONFIG(N8) =                 ACI const 0x00,  //'Config'
        EN_AA(N8) =                 ACI const 0x01,  //'Enable Auto Acknowledgment'
        EN_RXADDR(N8) =                 ACI const 0x02,  //'Enabled RX addresses'
        SETUP_AW(N8) =                 ACI const 0x03,  //'Setup address width'
        SETUP_RETR(N8) =         ACI const 0x04,  //'Setup Auto. Retrans'
        RF_CH(N8) =                 ACI const 0x05,  //'RF channel'
        RF_SETUP(N8) =                 ACI const 0x06,  //'RF setup'
        STATUS(N8) =                 ACI const 0x07,  //'Status'
        OBSERVE_TX(N8) =         ACI const 0x08,  //'Observe TX'
        CD(N8) =                         ACI const 0x09,  //'Carrier Detect'
        RX_ADDR_P0(N8) =         ACI const 0x0A,  //频道0接收数据地址
        RX_ADDR_P1(N8) =         ACI const 0x0B,  //'RX address pipe1'
        RX_ADDR_P2(N8) =         ACI const 0x0C,  //'RX address pipe2'
        RX_ADDR_P3(N8) =         ACI const 0x0D,  //'RX address pipe3'
        RX_ADDR_P4(N8) =         ACI const 0x0E,  //'RX address pipe4'
        RX_ADDR_P5(N8) =         ACI const 0x0F,  //'RX address pipe5'
        TX_ADDR(N8) =                 ACI const 0x10,  //'TX address'
        RX_PW_P0(N8) =                 ACI const 0x11,  //接收频道0接收数据长度
        RX_PW_P1(N8) =                 ACI const 0x12,  //'RX payload width, pipe1'
        RX_PW_P2(N8) =                 ACI const 0x13,  //'RX payload width, pipe2'
        RX_PW_P3(N8) =                 ACI const 0x14,  //'RX payload width, pipe3'
        RX_PW_P4(N8) =                 ACI const 0x15,  //'RX payload width, pipe4'
        RX_PW_P5(N8) =                 ACI const 0x16,  //'RX payload width, pipe5'
        FIFO_STATUS(N8) =         ACI const 0x17,  //'FIFO Status Register'
       
        //SPI(nRF24L01) commands
        READ_REG(N8) =                ACI const 0x00,  //Define read command to register
        WRITE_REG(N8) =                ACI const 0x20,  //Define write command to register
        RD_RX_PLOAD(N8) =        ACI const 0x61,  //Define RX payload register address
        WR_TX_PLOAD(N8) =        ACI const 0xA0,  //Define TX payload register address
        FLUSH_TX(N8) =                ACI const 0xE1,  //Define flush TX register command
        FLUSH_RX(N8) =                ACI const 0xE2,  //Define flush RX register command
        REUSE_TX_PL(N8) =        ACI const 0xE3,  //Define reuse TX payload register command
        NOP(N8) =                        ACI const 0xFF,  //Define No Operation, might be used to read status register
       
        公开 本机地址([N8*5]),        //本机地址
        time_out(N16),
       
        引擎(公开)
        初始化
        {
                CE_ddr = 1,
                CE_port = 0,
                CSN_ddr = 1,
                CSN_port = 1,
                IRQ_ddr = 0,
               
                //spi接口初始化
                spi init[],
               
                set[ CONFIG, 0b0000_1111 ],                //CRC使能,16位CRC校验,上电,接收模式
                set[ EN_AA, 0x01 ],                        //使能接收通道0自动应答
                set[ EN_RXADDR, 0x01 ],                //使能接收通道0
                set[ SETUP_AW, 0x03 ],                //设置地址宽度 5个字节
                set[ SETUP_RETR, 0xff ],                //自动重发延时等待4000us+86us,自动重发15次
                set[ RF_CH, 40 ],                        //选择射频通道40
                set[ RF_SETUP, 0x07 ],                //数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
                status(N8) = get[ STATUS ],                //返回状态寄存器
                write_command[ FLUSH_TX ],
                write_command[ FLUSH_RX ],
                set[ STATUS, status | 0b0111_0000 ],//清除TX_DS或MAX_RT中断标志
               
                //设置超时时间
                time_out = 0xffff,
        }
        引擎(公开)
        工作正常(T)
        {
                set[ RF_CH, 0x03 ],
                如果 get[ RF_CH ] != 0x03,
                        返回 false.
               
                set[ RF_CH, 0x40 ],
                如果 get[ RF_CH ] != 0x40,
                        返回 false.
               
                返回 true,
        }
        引擎(公开)
        转换到正常模式
        {
                c(N8) = get[ CONFIG ],
                c | 0b0000_0010,
                set[ CONFIG, c ],
        }
        引擎(公开)
        转换到掉电模式
        {
                c(N8) = get[ CONFIG ],
                c & 0b1111_1101,
                set[ CONFIG, c ],
        }
        引擎(公开)
        time(N16),
        设置超时时间
        {
                time_out = time,
        }
        引擎(公开)
        设置为接收模式
        {
                CE_port = 0,
               
                //写入接收通道地址
                write_buffer[ WRITE_REG + RX_ADDR_P0, 本机地址, 5 ],
               
                c(N8) = get[ CONFIG ],
                c | 0b0000_0001,
                set[ CONFIG, c ],
                CE_port = 1,
        }
        引擎(公开)
        设置为发射模式
        {
                CE_port = 0,
                c(N8) = get[ CONFIG ],
                c & 0b1111_1110,
                set[ CONFIG, c ],
                CE_port = 1,
        }
        引擎(公开)
        buffer([N8*?]), length(N8), TX_address([N8*?]),
        发射数据
        {
                //接收通道0选择和发送通道相同有效数据宽度
                set[ RX_PW_P0, length ],
               
                CE_port = 0,
               
                //写数据包到TX FIFO
                write_buffer[ WR_TX_PLOAD, buffer, length ],
                //写入发送地址
                write_buffer[ WRITE_REG + TX_ADDR, TX_address, 5 ],
                //为了应答接收设备,接收通道0地址和发送地址相同
                write_buffer[ WRITE_REG + RX_ADDR_P0, TX_address, 5 ],
               
                CE_port = 1,
               
                //等待应答
                反复执行 直到 IRQ_pin == 0, ...
               
                status(N8) = get[ STATUS ],        //返回状态寄存器
                set[ STATUS, status ],          //清除TX_DS或MAX_RT中断标志
                write_command[ FLUSH_TX ],
        }
        引擎(公开)
        buffer([N8*?]), length(N8), is_time_out(T),
        接收到数据(T)
        {
                //接收通道0选择和发送通道相同有效数据宽度
                set[ RX_PW_P0, length ],
               
                times(N16) = 0,
                反复执行 直到 IRQ_pin == 0,
                        如果 is_time_out,
                                times + 1,
                                如果 times == time_out,
                                        返回 false.
                                ...
                        ...
                sta(N8) = get[ STATUS ],
                set[ STATUS, sta ],
                read_buffer[ RD_RX_PLOAD, buffer, length ],
                返回 true,
        }
        //把p_buf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址
        引擎()
        reg(N8), p_buf([N8*?]), length(N8),
        write_buffer
        {
                CSN_port = 0,
               
                spi write_byte[ reg ],
                反复执行 初始 i(N8) = 0, 每次 i + 1, 直到 i == length,
                        spi write_byte[ p_buf i ],
                        ...
                CSN_port = 1,
        }
        //写一个命令
        引擎()
        cmd(N8),
        write_command
        {
                CSN_port = 0,
                spi write_byte[ cmd ],
                CSN_port = 1,
        }
        //读取nRF2401某个缓冲区内容
        引擎()
        reg(N8), p_buf([N8*?]), length(N8),
        read_buffer
        {
                CSN_port = 0,
               
                spi write_byte[ reg ],
                反复执行 初始 i(N8) = 0, 每次 i + 1, 直到 i == length,
                        p_buf i = spi read_byte[],
                        ...
                CSN_port = 1,
        }
        //写寄存器
        引擎()
        addr(N8), data(N8),
        set
        {
                CSN_port = 0,
                spi write_byte[ WRITE_REG + addr ],
                spi write_byte[ data ],
                CSN_port = 1,
        }
        //读寄存器
        引擎()
        addr(N8),
        get(N8)
        {
                CSN_port = 0,
                spi write_byte[ READ_REG + addr ],
                data(N8) = spi read_byte[],
                CSN_port = 1,
                返回 data,
        }
       
        公开 link CE_port(N1),
        公开 link CE_ddr(N1),
        公开 link IRQ_pin(N1),
        公开 link IRQ_ddr(N1),
        公开 link CSN_port(N1),
        公开 link CSN_ddr(N1),
       
        //SPI串行接口元件,高位在前,低位在后
        公开 spi 组件
        {
                //初始化
                引擎(公开)
                init
                {
                        SCK_ddr = 1,
                        SCK_port = 0,
                        MOSI_ddr = 1,
                        MOSI_port = 0,
                        MISO_ddr = 0,
                }
                //写一个字节
                引擎(公开)
                data(N8),
                write_byte
                {
                        反复执行 8 次,
                                MOSI_port = data 7(N1),
                                #asm "nop"
                                SCK_port = 1,
                                #asm "nop"
                                SCK_port = 0,
                                data << 1,
                                ...
                }
                //读一个字节
                引擎(公开)
                read_byte(N8)
                {
                        MOSI_port = 0,
                        data(N8),
                        反复执行 8 次,
                                data << 1,
                                SCK_port = 1,
                                #asm "nop"
                                data 0(N1) = MISO_pin,
                                #asm "nop"
                                SCK_port = 0,
                                ...
                        返回 data,
                }
               
                公开 link SCK_port(N1),        //时钟线
                公开 link SCK_ddr(N1),        //时钟线
                公开 link MISO_pin(N1),        //读数据端口
                公开 link MISO_ddr(N1),        //读数据端口
                公开 link MOSI_port(N1),        //写数据端口
                公开 link MOSI_ddr(N1),        //写数据端口
        }
}

出0入0汤圆

发表于 2012-6-3 14:36:37 | 显示全部楼层
C#对 CH372的封装,可以直接调用其中的函数控制CH372:



using System;
using System.Runtime.InteropServices;

namespace n_ch372
{
        public static class ch372
        {
                public delegate void deleSetNotify( IntPtr iBuffer );
                public delegate void deleSetIntRoutine( IntPtr iBuffer );
               
                public const int DEVICE_ARRIVAL = 3;                //设备插入事件,已经插入
                public const int DEVICE_REMOVE_PEND = 1;        //设备将要拔出
                public const int DEVICE_REMOVE = 0;                        //设备拔出事件,已经拔出

                //初始化
                public static void Init()
                {
                        ReadLength = new int[ 1 ];
                        ReadLength[ 0 ] = 0;
                }
               
                //打开设备
                public static int OpenDevice( int index )
                {
                        return (int)CH375OpenDevice( index );
                }
               
                //复位设备
                public static bool ResetDevice( int index )
                {
                        return CH375ResetDevice( index );
                }
               
                //关闭设备
                public static void CloseDevice( int index )
                {
                        CH375CloseDevice( index );
                }
               
                //设置超时
                public static bool SetTimeout( int index, int writeTimeout, int redTimeout )
                {
                        return CH375SetTimeout( index, writeTimeout, redTimeout );
                }
               
                //设置设备改动通知程序
                public static void SetDeviceNotify( int index, deleSetNotify iNotifyRoutine )
                {
                        CH375SetDeviceNotify( index, null, iNotifyRoutine );
                }
               
                //设置设备中断上传通知程序
                public static void SetIntRoutine( int index, deleSetIntRoutine iNotifyRoutine )
                {
                        CH375SetIntRoutine( index, iNotifyRoutine );
                }
               
                //读取数据
                public static bool ReadData( int index, byte[] buffer, ref int length )
                {
                        ReadLength[ 0 ] = length;
                        bool r = CH375ReadData( 0, buffer, ReadLength );
                        length = ReadLength[ 0 ];
                        return r;
                }
               
                static int[] ReadLength;
               
                [DllImport("CH375DLL.dll")]
                static extern IntPtr CH375OpenDevice(int iIndex);
               
                //复位USB设备
                [DllImport("CH375DLL.dll", EntryPoint = "CH375ResetDevice")]
                static extern bool CH375ResetDevice(int iIndex );
               
                //关闭CH375设备
                [DllImport("CH375DLL.dll", EntryPoint = "CH375CloseDevice")]
                static extern void CH375CloseDevice(int iIndex);
               
                //设置超时
                [DllImport("CH375DLL.DLL")]
        static extern bool CH375SetTimeout(
                int iIndex, int iWriteTimeout, int iReadTimeout);
        
        //取消USB操作
        [DllImport("CH375DLL.DLL")]
        static extern bool CH375Abort(int iIndex );
        
        //读取数据
                [DllImport("CH375DLL.DLL", EntryPoint = "CH375ReadData", ExactSpelling = false, SetLastError = true)]
                static extern bool CH375ReadData(
                Int16 iIndex, [MarshalAs(UnmanagedType.LPArray)] byte[] oBuffer, [MarshalAs(UnmanagedType.LPArray)]  Int32[] ioLength);//读单片机缓存
               
                //写入数据
                [DllImport("CH375DLL.DLL", EntryPoint = "CH375WriteData", ExactSpelling = false, SetLastError = true)]
                static extern bool CH375WriteData(
                Int16 iIndex, [MarshalAs(UnmanagedType.LPArray)]  byte[] iBuffer, [MarshalAs(UnmanagedType.LPArray)]  Int32[] ioLength);   //写单片机缓存
              
                //设置中断服务函数
                [DllImport( "CH375DLL.DLL ")]
                static extern bool CH375SetIntRoutine(
                int iIndex, deleSetIntRoutine iIntRoutine);
               
                //设定设备事件通知程序
                //可选参数,指向字符串,指定被监控的设备的ID,字符串以\0终止
                //指定设备事件回调程序,为NULL则取消事件通知
                [DllImport( "CH375DLL.DLL ")]
                static extern bool CH375SetDeviceNotify(
                int iIndex, string iDeviceID, deleSetNotify iNotifyRoutine );
        }
}

出0入0汤圆

发表于 2012-6-3 14:40:39 | 显示全部楼层
horalxi 发表于 2012-5-16 10:59
决定采用您的方案,正在研究资料。
还是希望楼主能提供点资料。

注意在无线模块的初始化一定要加上这句:

write_command( FLUSH_TX );
write_command( FLUSH_RX );

网上好多版本的初始化是没有这两句的或者是不全的,虽然也能正常工作,但是断电再复位就容易出问题.

出0入42汤圆

发表于 2012-6-3 15:07:56 | 显示全部楼层
本帖最后由 ccstc 于 2012-6-3 15:09 编辑

以前用Tiny24做的HID键盘,用来控制mach启动循环加工的
遥控找了一个315M的控制器,接收用的PT2272-M4解码的,注意别干扰别人和被别人干扰就好了
你可以参考一下,非常简单

程序

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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