微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC12C5A60S2与ADS1118通过SPI通讯的问题

STC12C5A60S2与ADS1118通过SPI通讯的问题

时间:10-02 整理:3721RD 点击:
问题:STC的SPI是8位的,ADS1118的命令和数据都是16位的,都有SPI功能,两者通过SPI协议通讯,是否可以使用STC的SPI实现,还是说必须通过模拟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写数据和读数据实在不会呀?

小编有没有调通啊?我的也是出不来啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top