作者wads90828 (阿乾)
看板ASM
标题[问题] 8051与MAX3100 SPI控制
时间Sat Jan 31 19:50:08 2015
各位版上先进好
小弟现在使用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://webptt.com/cn.aspx?n=bbs/ASM/M.1422705010.A.828.html
1F:推 WolfLord: 你是直接接TTL还是透过IR发射器? IR ON 会使用IR编码喔 02/01 08:38
2F:→ wads90828: 您好 我是新手不太懂 TTL是指我在外加电晶体吗? 我是 02/02 10:28
3F:→ wads90828: 把51直接接到max3100 没有再接其他电路唷 02/02 10:29
4F:推 WolfLord: 那把IR设为0吧 02/02 17:25
5F:推 jiannan1828: MISO要改high,然後还要pull high 02/03 00:56
6F:→ jiannan1828: IO2SPI,基本上没问题,我以前也做过 02/03 00:57
7F:→ jiannan1828: pull high大概1.5K~2K 02/03 00:58
感谢各位回复
我把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
8F:推 ruemann: 啊就DELAY不够啊....你传2BYTE=20bits 20/4800=4.16ms 02/27 18:04
9F:→ ruemann: 啊你才delay2ms,最好是够 02/27 18:04
10F:→ wads90828: 所以延长时间大於就可以吗? 还是有点问题耶 03/03 19:15