[問題] 8051與MAX3100 SPI控制

看板ASM (組合語言)作者 (阿乾)時間10年前發表 (2015/01/31 11:50), 10年前編輯推噓4(406)
留言10則, 4人參與, 最新討論串1/2 (看更多)
各位版上先進好 小弟現在使用STC12C5A60S2的晶片 想透過SPI的方式寫入資料到MAX3100 並且透過UART的方式傳回給電腦看 也就是 8051→MAX3100→MAX3100的TX接PC的RX→透過TERMINAL看資料 可是TERMINAL都收不到資料 以下是程式碼 麻煩看一下是哪裡有錯呢? #include "STC12C5A60S2.h" sbit SCLK = P1^7; sbit MISO = P1^6; sbit MOSI = P1^5; sbit SPISS = P0^0; #define MASTER void spi(unsigned int dat ); void MAX3100init(unsigned int dat); void main() { MAX3100init(0xc08b); //irda模式 9600bit/s 振盪器3.6864MHZ while(1) { spi(0x8080); //發送資料到TX端 } } void MAX3100init(unsigned int dat) { spi(dat); } void spi(unsigned int dat) { unsigned char i = 0; unsigned int k; k=dat; SPISS=0; //選擇從機 for(i=0;i<16;i++) { SCLK=0; if(k & 0x8000) { MOSI=1 ; } else { MOSI=0; } SCLK=1; k=k<<1; } SPISS=1; } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.125.20.234 ※ 文章網址: https://www.ptt.cc/bbs/ASM/M.1422705010.A.828.html

02/01 08:38, , 1F
你是直接接TTL還是透過IR發射器? IR ON 會使用IR編碼喔
02/01 08:38, 1F

02/02 10:28, , 2F
您好 我是新手不太懂 TTL是指我在外加電晶體嗎? 我是
02/02 10:28, 2F

02/02 10:29, , 3F
把51直接接到max3100 沒有再接其他電路唷
02/02 10:29, 3F

02/02 17:25, , 4F
那把IR設為0吧
02/02 17:25, 4F

02/03 00:56, , 5F
MISO要改high,然後還要pull high
02/03 00:56, 5F

02/03 00:57, , 6F
IO2SPI,基本上沒問題,我以前也做過
02/03 00:57, 6F

02/03 00:58, , 7F
pull high大概1.5K~2K
02/03 00:58, 7F
感謝各位回復 我把irda改為uart狀態有好轉了 可是現在丟的資料電腦接收都是錯的 google後發現可能是速度問題所以要加適當的延時 修改後接受到的資料還是有問題 以下附上程式碼給大家幫忙了 謝謝 #include "STC12C5A60S2.h" #include<intrins.h> sbit SCLK = P0^3; sbit MISO = P0^2; sbit MOSI = P0^1; sbit SPISS = P0^0; void delay1msX(unsigned int count); void inital_SPI(); void spi(unsigned short dat ); void MAX3100init(unsigned short dat); void main() { MISO=1; MAX3100init(0xe00c); //普通UART模式 4800bit/s 振盪器3.6864MHZ while(1) { spi(0x8012); //發送資料到TX端 delay1msX(1); delay1msX(1); } } void MAX3100init(unsigned short dat) { spi(dat); } void spi(unsigned short dat) { unsigned char i = 0; unsigned short k; k=dat; SPISS=0; //選擇從機 for(i=0;i<16;i++) { if(k & 0x8000) { MOSI=1 ; } else { MOSI=0; } SCLK=1; __nop_(); __nop_(); k=k<<1; SCLK=0; } SPISS=1; } void delay1msX(unsigned int count) // 1ms*count 延遲副程式 { unsigned int i,j; for(i=0;i<count;i++) for(j=0;j<114;j++); } ※ 編輯: wads90828 (140.125.20.234), 02/03/2015 11:43:34 ※ 編輯: wads90828 (140.125.20.234), 02/03/2015 11:44:42

02/27 18:04, , 8F
啊就DELAY不夠啊....你傳2BYTE=20bits 20/4800=4.16ms
02/27 18:04, 8F

02/27 18:04, , 9F
啊你才delay2ms,最好是夠
02/27 18:04, 9F

03/03 19:15, , 10F
所以延長時間大於就可以嗎? 還是有點問題耶
03/03 19:15, 10F
文章代碼(AID): #1KpC5oWe (ASM)
討論串 (同標題文章)
文章代碼(AID): #1KpC5oWe (ASM)