基于STM32的PCL6045B開發(fā)體會(huì)
于是我猜想是不是我寫入的數(shù)據(jù)不能改變高16位,只能改變低16位.
所以我就做了以下測(cè)試工作:
現(xiàn)在發(fā)現(xiàn)向DSP各軸緩沖區(qū)寫入數(shù)據(jù)時(shí),總是不能寫進(jìn)去高16位,而低十六位能寫進(jìn)去。比如,我寫p645_wreg(AXS_AX,WRENV1,0x00000001); //控制脈沖類型。
p645_wreg(AXS_AX,WRENV1,0x00000002);
p645_wreg(AXS_AX,WRENV1,0x00000003);
分別能看到輸出不同類型的脈沖。證明低位操作有效!
但是當(dāng)我寫做定長(zhǎng)測(cè)試時(shí),代碼如下
p645_wreg(AXS_AZ, WPRMD, 0x00000041); //定長(zhǎng)運(yùn)動(dòng)模式
p645_wreg(AXS_AZ, WRMV, 65536L);//這里寫入65535以下的數(shù)均能準(zhǔn)確控制電機(jī)走的步數(shù),超過65535,則會(huì)出現(xiàn)電機(jī)持續(xù)運(yùn)動(dòng)而不受控制的異常狀況!
p645_wreg(AXS_AZ, WRFL, 500L);
p645_wreg(AXS_AZ, WRFH, 2000L);
p645_wreg(AXS_AZ, WRUR, 200L);
p645_wreg(AXS_AZ, WRDR, 400L);
p645_wreg(AXS_AZ, WRMG, 5L);
p645_wcom(AXS_AZ,STAUD);
另外,超過65535時(shí)我讀取出COUNT1中數(shù)據(jù)也是沒有規(guī)律的。而不超過65535時(shí),則完全正常!
1.當(dāng)寫入65535時(shí),電機(jī)運(yùn)轉(zhuǎn)過程讀出數(shù)據(jù)如下:
Counter1 Counter2
指令 編碼器(這里是默認(rèn)的1倍,跟我們的編碼器對(duì)應(yīng)上是對(duì)的)
0000019662 0000000958
0000039790 0000001937
0000059918 0000002917
0000065535 0000003191
0000065535 0000003191
0000065535 0000003191
0000065535 0000003191
2.當(dāng)寫入65536及以上時(shí),電機(jī)運(yùn)轉(zhuǎn)過程讀出數(shù)據(jù)如下:
Counter1 Counter2
指令編碼器(這里是默認(rèn)的1倍,跟我們的編碼器對(duì)應(yīng)上是對(duì)的)
0000019662 0000000958
0000039790 0000001937
0000059917 0000002917
0000014509 0000003898
0000034637 0000004878
0000054764 0000005857
0000009356 0000006837
0000029484 0000007818
0000049611 0000008797
0000004203 0000009776
0000044458 0000011737
0000064586 0000012718
0000019177 0000013697
0000039305 0000014676
0000059433 0000015657
0000034152 0000017617
0000054279 0000018596
0000008871 0000019577
0000028999 0000020557
0000049126 0000021536
0000003718 0000022516
0000023846 0000023497
0000043973 0000024476
0000018692 0000026436
0000058948 0000028397
0000013539 0000029375
0000033667 0000030355
0000053794 0000031335
以上數(shù)據(jù)均不超過65535
基于上述現(xiàn)象,我做了個(gè)程序來測(cè)試 讀寫,發(fā)現(xiàn),我寫入的數(shù)據(jù)到緩沖去時(shí)超過0x00ffffff時(shí),讀出來的數(shù)據(jù)是不對(duì)的,只有低24位能讀出來,高8位讀出來的均是0.
寫寄存器函數(shù)修改如下:
void p645_wreg(unsigned int base_addr,unsigned int rwcom,unsigned intdata)
{
unionudata{
unsigned int ldata;
unsigned short idata[2];
}udt;
udt.ldata = data;
outpw (base_addr 2, udt. idata[0]);
outpw (base_addr 3, udt. idata[1]);
//outpw (base_addr, rwcom);
}
測(cè)試代碼如下:
p645_wreg(AXS_AZ,WRENV2,0xffffffff);
data3=inpw (AXS_AZ 2);
data4=inpw (AXS_AZ 3);
讀出的數(shù)據(jù)只能是data3=65535;data4=255,即最高8位丟失!
當(dāng)p645_wreg(,,); 寫入的數(shù)據(jù)是低0x00ffffff以下的數(shù)據(jù)時(shí),data3;data4讀出來的數(shù)據(jù)是對(duì)的。即寫什么讀出什么。這就是對(duì)我現(xiàn)在遇到的問題的詳細(xì)敘述。本文引用地址:http://butianyuan.cn/article/201612/324398.htm
后來經(jīng)過一番折騰,經(jīng)過大量的測(cè)量觀察發(fā)現(xiàn)。是高16位中的高低字節(jié)順序被對(duì)調(diào)了。郁悶了。于是我與日本方便的工程師交流,他們讓將STM32的A1~A4與PCL6045的A1~A4相連,(原來是STM32的A0~A3與PCL6045的A1~A4)
于是地址也更改為
#define AXS_AX 0x90000000
#define AXS_AY 0x90000008
#define AXS_AZ 0x90000010
#define AXS_AU 0x90000018
我感覺很奇怪。地址線的不同應(yīng)該只是地址的不一樣而已,怎么會(huì)導(dǎo)致高兩個(gè)字節(jié)的高低8位對(duì)調(diào)呢。日本方面說是他們的芯片內(nèi)部設(shè)計(jì)是那樣的,而我在日脈手冊(cè)上沒有看到任何說明。
之后進(jìn)一步研究,我的PCL6045控制自如,全部功能順利驗(yàn)證了一遍。
以上就是我開發(fā)PCL6045B過程中的開發(fā)體會(huì)。轉(zhuǎn)載請(qǐng)注明出處,有問題歡迎交流。
評(píng)論