打印

关于Port_1_data_shade

[复制链接]
2233|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chengli|  楼主 | 2008-11-20 10:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Port_1_data_shade这个设置,在芯片手册中没有,请问这个是起什么作用,怎么使用呢
沙发
jxp_sun| | 2008-11-20 11:24 | 只看该作者

Port_1_data_shade是Port1的影子寄存器

是一个Ram变量, 不是Register.
譬如: 你想操作Port1, 读-修改-写,一般是这样操作
PRT1DR |= 0x01;
但是实际的结果可能是你不只是修改了PRT1DR的Bit0.
因为PRT1DR读的是端口的值,端口的值和PRT1DR不一定对应.
所以经常在写PRT1DR的时候先把以前写的值先保存下来,然后做
读-修改-写操作的时候把上面的一句改成下面的操作.
Port_1_data_shade |= 0x01;
PRT1DR = Port_1_data_shade;

使用特权

评论回复
板凳
chengli|  楼主 | 2008-11-20 12:42 | 只看该作者

一个疑问

多谢jxp_sun !

我得问题具体是这样子的,使用用户模块,PS2;使用P1.3;P1.4连接SDATA和SCLK;在device edit里面生成PS2D模块,然后generate 程序;在PS2D的datasheet中:

Note When using this the PS2D User Module and GPIO pins from Port n (Pn.2-Pn.7), the application should use the Port_n_Data_SHADE shadow register to ensure consistent data handling. From assembly language, you can access the Port_n_Data_SHADE RAM location directly. From C language, you should include an extern reference: 
    extern BYTE Port_n_Data_SHADE;    // Where n is the port number
    那么我的理解是,要用 Port_1_Data_SHADE来映射P1.3,P1.4口来作为SCLK和SDATA是吗?

    那么:     1:怎么使用Port_1_Data_SHADE怎么使用
        2:作为PS2 host和 PS2 Keybord怎么调用后面的function
我查了designer的help;但是没有足够的解答,同时也没有获取足够资料的来源,请问该怎么解决呢

          还有,我调试的时候,发现在.asm中,有个操作会改变P1kou

使用特权

评论回复
地板
chengli|  楼主 | 2008-11-20 12:43 | 只看该作者

接上文

p1口的输出,
PS2D_1_Send_0:
    AND    [Port_1_Data_SHADE], ~PS2D_1_SDATA ; Set the data bit low
    JMP    PS2D_1_Clock_Out_Bit             ; This jump maintains the same number
                                            ; of clock cycles for both a 1 or 0
; Jump here to clock out the bit
PS2D_1_Clock_Out_Bit:
    MOV    A, [Port_1_Data_SHADE]           ; Get the shadow
    MOV    REG[PS2D_1_DR], A                ; Clock High and data

    DELAY    10, 12                         ; Wait 10 uSec

    ; Clock Low                             ; Clock Low and the data
    XOR    [Port_1_Data_SHADE], PS2D_1_SCLK ; Clock Low
    MOV    A, [Port_1_Data_SHADE]           ; Get the shadow
    MOV    REG[PS2D_1_DR], A                ; Clock Low and data
    
    DELAY    38, 12                         ; Wait 38 uSec

    ; Clock High                            ; Finally Clock High and the data
    XOR    [Port_1_Data_SHADE], PS2D_1_SCLK ; Clock High
    MOV    A, [Port_1_Data_SHADE]           ; Get the shadow
    MOV    REG[PS2D_1_DR], A                ; Clock High and data
    
    DELAY    22, 60                         ; Wait 22 uSec

    ; Check for inhibit
    CLEARC                                  ; Carry clear indicates success
    TST    REG[PS2D_1_DR], PS2D_1_SCLK      ; Inhibit? 
    JNZ    .clock_done                      ; Jump if not 
    SETC                                    ; Carry set indicates fail/Inhibit

.clock_done:
    ; Done
    RET

就是
    XOR    [Port_1_Data_SHADE], PS2D_1_SCLK ; Clock High
    MOV    A, [Port_1_Data_SHADE]           ; Get the shadow
    MOV    REG[PS2D_1_DR], A                ; Clock High and data

使用特权

评论回复
5
jxp_sun| | 2008-11-21 10:24 | 只看该作者

其实文档还是满清楚的

Port_1_Data_SHADE是整个PRT1DR(P1.0~P1.7)的影子寄存器. 可能你还是没有理解. 就是一个缓存吧. 
下面
XOR    [Port_1_Data_SHADE], PS2D_1_SCLK ; Clock High
是改变Clock, PS2是2线的, 数据/时钟都要操作.

使用特权

评论回复
6
cma| | 2008-11-21 12:17 | 只看该作者

请参考

请参考本栏中帖子:“关于PSoC GPIO的应用讨论(多页) (4637字节) ”
https://bbs.21ic.com/club/bbs/list.asp?boardid=59&page=1&t=3154131&tp=%u5173%u4E8EPSoC%20GPIO%u7684%u5E94%u7528%u8BA8%u8BBA%uFF08%u591A%u9875%uFF09

或许对你了解为何使用Port_1_data_shade有帮助。
相关链接:https://bbs.21ic.com/club/bbs/list.asp?boardid=59&page=1&t=3154131&tp=%u5173%u4E8EPSoC%20GPIO%u7684%u5E94%u7528%u8BA8%u8BBA%uFF08%u591A%u9875%uFF09

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

66

帖子

1

粉丝