STC12C5A60S2与ADS1118通过SPI通讯的问题
8位机可以和16位机正常通讯,前提是通讯的数据要做好处理,不然会出错
能否说一下“数据做好处理”的关键点,都有那些方面,谢谢
下午我想了个办法,把单片机的MOSI和MISO连在了一起......有结果返回,也不知道对不对。另外,干吗老说我的回复内容有不良信息......贴的代码也没了。
#include<reg51.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>
typedef unsigned char BYTE; //8
typedef unsigned int WORD; //16
typedef unsigned long DWORD;//32
sfr AUXR = 0x8E;
sfr SPSTAT = 0XCD;
#define SPIF 0x80 //1000,0000
#define WCOL 0x40 //0100,0000
sfr SPCTL = 0XCE;
#define SSIG 0x80 //1000,0000
#define SPEN 0x40 //0100,0000
#define DORD 0x20 //0010,0000
#define MSTR 0x10 //0001,0000
#define CPOL 0x08 //0000,1000
#define CPHA 0x04 //0000,0100
#define SPDHH 0x00
#define SPDH 0x01
#define SPDL 0x02
#define SPDLL 0x03
sfr SPDAT = 0xCF;
sfr IE2 = 0xAF;
#define ESPI 0x02; //IE2.1
void InitUart();
void InitSPI();
void SendUart(BYTE dat);
BYTE RecvUart();
BYTE RecvDate;
BYTE RecvSPI;
main()
{
InitUart();
InitSPI();
IE2 |= ESPI;
EA = 1;
while(1)
{
RecvDate=RecvUart();
SendUart(RecvDate);
SPDAT=RecvDate;
while (!(SPSTAT & SPIF)); //wait send complete
SPSTAT = SPIF | WCOL; //clear SPI status
}
}
void InitSPI(void)
{
SPDAT = 0;
SPSTAT = SPIF | WCOL;
SPISS=1;
SPCTL=SSIG|SPEN|MSTR|CPHA|SPDLL; //master mode
}
void spi_isr() interrupt 9 using 1
{
SPSTAT = SPIF | WCOL;
SPISS = 1;
RecvSPI=SPDAT;
SendUart(RecvSPI);
}
void InitUart()
{
SCON=0x50; //set UART mode as 8-bit variable baudrate
TMOD|=0x20; //timer1 as 8 bit auto reload mode //自动重载8位定时器/计数器
AUXR|=0x40;
TH1=TL1=0xFD; //
TR1=1;
SM0=0;
SM1=1;//串行方式1
}
void SendUart(BYTE dat)
{
SBUF=dat; //send current data
while(!TI); //wait pre-data sent
TI=0; //clear ti flag
}
BYTE RecvUart(void)
{
while(!RI);
RI=0;
return SBUF;
}
你为什么要把这两条线连在一起呢?
MISO的含义你知道么?
MISO = Main in slave out 主入从出,即MCU写从器件
MOSI = Main out slave in 主出从入,即MCU读从器件。
感觉你现在对SPI操作不熟悉。建议你先用口线模拟一下SPI接口,这个过程可以让人深入的理解SPI操作,之后再用硬件SPI接口的时候就游刃有余了。要不然,你一知半解的,以后遇到问题仍然无从下手。
学习了
1、模拟方式对器件DS1302,通过了 。我的理解是半双工的模拟SPI
2、对ADS1118的SPI是全双工的,且16位,连接运行程序看返回的内容根本就不知道是SPI程序本身有问题,或者是发送的命令字有问题,或者是其他有问题。所以我只有先确定我写的借用单片机本身SPI功能的程序是符合要求的。
3、我只有一块学习板,没有办法测试单片机本身的SPI功能,把远端的从机假设为透明的,把MOSI接到MISO上,是不是可以认为远端有了一个完全代码的从机在,信息从MOSI上输出又从MISO上返回。
如果哪位有8位单片机SPI对16位外设的经验,请讲一下对于连续发送两个字节和接收两个/四个字节的步骤,能有代码例子最好。
今天打算继续测试,先在发送环节把SPI中断去掉。因为命令字可以设远端连续发送模式,所以我想主机在发送的时候可以不考虑接收,待命令字发送完毕后再行接收从机连续发送的数据。
求助一下各位大神:我用的是51开发板调试ADS1118的,并且用的是串口调试,但为什么一直输出同样的值:如图所示:
怎么用ads1118直接测量电压值
求指教呀!ads1118中的SPI写数据和读数据实在不会呀?
小编有没有调通啊?我的也是出不来啊