如何獲取CH384的如何獲取輸入數(shù)據(jù)

圖片.png

目前可以控制2~9管腳(即 D0~D7)的輸出,以及1、14、16、17管腳的輸出,和10、11、12、13、15管腳的讀取。

請問如何將根據(jù)CH384的手冊2~9管腳是可以作為輸入模式的,請問需要如何配置呢?


下面代碼是(控制2~9管腳(即 D0~D7)的輸出,以及1、14、16、17管腳的輸出,和10、11、12、13、15管腳的讀取。)

#include?
#include??
#include?
#include??
#include??
#include??
#include??
#include?

#if?__LP64__?
????#define?strtoptr?strtoull
#else
????#define?strtoptr?strtoul?
#endif

//#define?PAGE_SIZE?16384



int?main(int?argc,?char?*argv[])?
{?

????size_t?PAGE_SIZE;
????int?width?=?1;????
????void?*virt_addr;
????off_t?target,?target_base;
????unsigned?long?read_result,?writeval;
????int?type_width;
????uint32_t?value?=?0,param=0,temp=0;?
????PAGE_SIZE?=?getpagesize();?

????uintptr_t?addr?=?strtoptr("0x0efdfc007400",?0,?16);?//strtoptr(argv[1],?0,?16);?//strtoptr("0x0efdfc007400",?0,?16);?
????uintptr_t?endaddr?=?0;??

????if?(!endaddr)?
????????endaddr?=?addr?+?width?-?1;?

????????//fprintf(stderr,"argv[1]?%s?addr?%08x?PAGE_SIZE?%08x\n",?argv[1],addr,PAGE_SIZE);?

????int?fd?=?open("/dev/mem",?O_RDWR?|?O_SYNC);?
????if(fd?<?0)?
????{?
????????fprintf(stderr,"cannot?open?/dev/mem\n");?
????????return?-1;?
????}?
????off_t?mmap_start?=?addr?&?~(PAGE_SIZE?-?1);?
????size_t?mmap_size?=?endaddr?-?mmap_start?+?1;
????mmap_size?=?(mmap_size?+?PAGE_SIZE?-?1)?&?~(PAGE_SIZE?-?1);?
????void*?page?=?mmap64(0,?mmap_size,?PROT_READ?|?PROT_WRITE,?MAP_SHARED,?fd,?mmap_start);?
????if(page?==?MAP_FAILED)
????{?
????????fprintf(stderr,"cannot?mmap?region\n");?
????????return?-1;?
????}?

??

????volatile?uint8_t*?PDR_reg=?(volatile?uint8_t*)?(((uintptr_t)?page)?+?(addr?&?(PAGE_SIZE?-1?)));?
????volatile?uint8_t*?PSR_reg?=?(volatile?uint8_t*)?(((uintptr_t)?page)?+(?(addr+0x01)?&?(PAGE_SIZE?-1?)));?
????volatile?uint8_t*?PCR_reg?=?(volatile?uint8_t*)?(((uintptr_t)?page)?+(?(addr+0x02)?&?(PAGE_SIZE?-1?)));?
????volatile?uint8_t*?PXR_reg?=?(volatile?uint8_t*)?(((uintptr_t)?page)??+(?(addr+0x03)?&?(PAGE_SIZE?-1?)));?
????
????PDR_reg=0XFF;//2~9管腳輸出高電平
????PCR_reg=0x04;//1、14、16、17管腳的輸出高電平
????fprintf(stderr,"?10、11、12、13、15管腳的讀取?PSR?%02x?\n",??(*PSR_reg)&0xF8);
????
????
????
}


您好,PSR為RO只讀寄存器,是不用單獨設定方向的。可以先測試下支持RW的PCR和PXR寄存器,先寫入后讀,看下是否可以正常訪問。


如何讀取PIR數(shù)據(jù)輸入寄存器呢?

volatile?uint8_t*?PDR_reg=?(volatile?uint8_t*)?(((uintptr_t)?page)?+?(addr?&?(PAGE_SIZE?-1?)));

volatile?uint8_t*?PIR_reg=?(volatile?uint8_t*)?(((uintptr_t)?page)?+?(addr?&?(PAGE_SIZE?-1?)));


*PDR_reg=0XFF;//實際測試 2~9管腳可以輸出高電平(3v)


下面那對PIR_reg進行讀取是否有問題呢

?fprintf(stderr," 讀取PIR %02x?\n", *PIR_reg);


查看手冊PIR和PDR的地址偏移地址相同。


圖片.png


目前PSR寄存器可以讀取的,PSR的對應管腳PIN_1(STROBE)、PIN_14(line feed)、PIN_16(RESET)、PIN_17(select printer)的電平信號可以正常識別的。

PDR數(shù)據(jù)輸出寄存器可以正常對端口進行輸入電平的,其對應并口針的順序是9,8,7,6,5,4,3,2。

PXR設置默認值為0X00。

PCR狀態(tài)寄存器的讀寫正常,并可以控制并口管腳1,10,12,13,15輸出高低電平。


1、在EPP模式,讀寫D0~D7數(shù)據(jù)的時候需要通過PCR的DIRIN設置傳輸方向。

2、在ECP模式,讀寫D0~D7數(shù)據(jù)的時候需要通過PCR的DIRIN和PXR的ECPDIRIN設置傳輸方向。

另,EPP/ECP方式下讀取的為已經鎖存的輸入緩沖區(qū)內數(shù)據(jù)。

SPP模式,若不能直接讀取,可按照EPP操作那樣試下,單獨設定DIRIN后再讀取。


分別測試


第一組設置 (SPP模式)

PDR=0x00

PXR=0X00(默認是spp模式)

PCR=0XC0

PIR讀取的值為0x00。(使用萬有表測試,在D0~D7輸出0V,無外其接設備)。




PDR=0xff(修改)

PXR=0X00(默認是spp模式)

PCR=0XC0

PIR讀取的值為0xff。(使用萬有表測試,在D0~D7輸出3.3V,無外其接設備)。


PDR=0xF0(修改)

PXR=0X00(默認是spp模式)

PCR=0XC0

PIR讀取的值為0xf0。(使用萬有表測試,在D4~D7輸出3.3V,無外其接設備)。


該組的PIR讀取的數(shù)據(jù)均為PDR的數(shù)值。讀取失敗。







第二組 (spp+PCR_DIRIN置1)

在第一組的情況的修改

PCR=0XE0;

測試的結果和第一組相同。


是否有現(xiàn)成的讀取PIR的來獲取D0~D7的例子代碼嗎。


下面的測試代碼是否問題呢?

#include?
#include??
#include?
#include??
#include??
#include??
#include??
#include?
?
#if?__LP64__?
????#define?strtoptr?strtoull
#else
????#define?strtoptr?strtoul?
#endif
?
//#define?PAGE_SIZE?16384
?
?
?
int?main(int?argc,?char?*argv[])?
{?
?
????size_t?PAGE_SIZE;
????int?width?=?1;????
????void?*virt_addr;
????off_t?target,?target_base;
????unsigned?long?read_result,?writeval;
????int?type_width;
????uint32_t?value?=?0,param=0,temp=0;?
????PAGE_SIZE?=?getpagesize();?
?
????uintptr_t?addr?=?strtoptr("0x0efdfc007400",?0,?16);?//strtoptr(argv[1],?0,?16);?//strtoptr("0x0efdfc007400",?0,?16);?
????uintptr_t?endaddr?=?0;??
?
????if?(!endaddr)?
????????endaddr?=?addr?+?width?-?1;?
?
????????//fprintf(stderr,"argv[1]?%s?addr?%08x?PAGE_SIZE?%08x\n",?argv[1],addr,PAGE_SIZE);?
?
????int?fd?=?open("/dev/mem",?O_RDWR?|?O_SYNC);?
????if(fd?<?0)?
????{?
????????fprintf(stderr,"cannot?open?/dev/mem\n");?
????????return?-1;?
????}?
????off_t?mmap_start?=?addr?&?~(PAGE_SIZE?-?1);?
????size_t?mmap_size?=?endaddr?-?mmap_start?+?1;
????mmap_size?=?(mmap_size?+?PAGE_SIZE?-?1)?&?~(PAGE_SIZE?-?1);?
????void*?page?=?mmap64(0,?mmap_size,?PROT_READ?|?PROT_WRITE,?MAP_SHARED,?fd,?mmap_start);?
????if(page?==?MAP_FAILED)
????{?
????????fprintf(stderr,"cannot?mmap?region\n");?
????????return?-1;?
????}?
?
???
?
????volatile?uint8_t*?PDR_reg=?(volatile?uint8_t*)?(((uintptr_t)?page)?+?(addr?&?(PAGE_SIZE?-1?)));?
????volatile??uint8_t*?PIR_reg=?(volatile?uint8_t*)?(((uintptr_t)?page)?+?(addr?&?(PAGE_SIZE?-1?)));
????volatile?uint8_t*?PSR_reg?=?(volatile?uint8_t*)?(((uintptr_t)?page)?+(?(addr+0x01)?&?(PAGE_SIZE?-1?)));?
????volatile?uint8_t*?PCR_reg?=?(volatile?uint8_t*)?(((uintptr_t)?page)?+(?(addr+0x02)?&?(PAGE_SIZE?-1?)));?
????volatile?uint8_t*?PXR_reg?=?(volatile?uint8_t*)?(((uintptr_t)?page)??+(?(addr+0x03)?&?(PAGE_SIZE?-1?)));?
?????

????fprintf(stderr,"?PIR_reg%02x?\n",?*PIR_reg);//讀取之前的PIR_reg
????
????
????PXR_reg=stroul(argv[1],0,16);//設置PXR的數(shù)值。?
????PCR_reg=stroul(argv[2],0,16);//設置PCR的數(shù)值。

????fprintf(stderr,"?PXR_reg%02x?\n",?*PXR_reg);//讀取PXR_reg
????fprintf(stderr,"?PCR_reg%02x?\n",?*PCR_reg);//讀取PCR_reg
????
????fprintf(stderr,"?PIR_reg%02x?\n",?*PIR_reg);//讀取PIR_reg
?????fprintf(stderr,"?PSR_reg?%02x?\n",?*PSR_reg?);//讀取PSR_reg?
?????
?????PDR_reg=stroul(argv[3],0,16);//設置PDR_reg的數(shù)值。
????
?????
?????
}



您好,如上SPP流程測試無問題。另,測試EPP并口時,PXR的MODEEPP是否已經開啟。在EPP和ECP方式,數(shù)據(jù)為鎖存數(shù)據(jù)。如:EPP方式,數(shù)據(jù)在AFD或SIN引腳輸出低電平才會鎖存,因此不能直接測量。


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频