找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9374|回复: 9
收起左侧

求助!宏晶stc15单片机spi主从通讯问题,请进来!万谢!

[复制链接]
ID:87448 发表于 2015-10-4 01:35 | 显示全部楼层 |阅读模式
大假小弟哪都没去,在家调试了很久,确实很疲惫,半个月的努力没见成效,求助万能的矿石请同学们指教!
      主从单片机的项目都成了,但是总是发现从机结果偶尔不对,很不可靠,写了这两段主,从程序,通过串口助手观察发现总会掉码,很多地方都试图加了延时,还是不见成效!
      主从通讯都已经是128的分频了,怎么还会这样?主机144字节的数组占用的是内部扩展RAM,通过spi发送到从机内部的扩展RAM,144个字节就差不多10%掉了,这是怎么回事?万分感谢!!!!!!!!
spi电路.jpg SPI调试.JPG

回复

使用道具 举报

ID:87448 发表于 2015-10-4 01:37 | 显示全部楼层
/芯片的工作频率为22.1184MHz 主机源码
#include<STC15F2K60S2.H>
#include <INTRINS.H>
#include<ABSACC.H>
#include<STDIO.H>
#include "AD_SPI.H"

#include "AD_UartInit.H"
       
#define  ulong unsigned long          // 4 byte
#define  uint unsigned int                   //2 byte                 0-65535
#define  uchar unsigned char                 // byte                 0-255
#define  nop8();  {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();};
void Delay20us();
void Delay50ms();
uchar  *AD_array_point;
uchar xdata AD_ZERO[144]  _at_ 0x20;

uchar k,i,j;
void main()
{
     Delay50ms();
     AD_UartInit();
     AD_InitSpi();
     IE2 |= ESPI;
     EA = 1;
         
         while(1){
             for(j=0;j<144;j++)         //RAM初始化
      {
     AD_ZERO[j]=0;
      }
         
         /**********************/
         while(!RI);         //*****
         RI=0;
         
         
         for(k=0;k<144;k++)                 //72通道采样
         {
         AD_ZERO[k]= k;
         
         }
         /********发送数组到从机***************/
         AD_array_point=AD_ZERO;          //定位调零数组
         for(k=0;k<144;k++)
         {
         SS=0;
         SPDAT=*AD_array_point;
         AD_array_point++;
         Delay20us();
         Delay20us();
         Delay20us();
         Delay20us();
         Delay20us();
         Delay20us();
         
         }
         /***********显示发送到从机的数组*********************/
         AD_array_point=AD_ZERO;
         for(k=0;k<144;k++)
         {
          TI=1;
          printf("0X%bx\n",AD_ZERO[k]); //0928屏蔽
         
         }
         
    }
}



void Delay50ms()                //@22.1184MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 5;
        j = 52;
        k = 195;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void spi_isr() interrupt 9 using 1     //SPI中断服务程序 9 (004BH)
{
          
        SPSTAT = SPIF | WCOL;       //清除SPI状态位
        SS = 1;                  //拉高从机的SS
       
}
void Delay20us()                //@22.1184MHz
{
        unsigned char i;

        i = 108;
        while (--i);
}




回复

使用道具 举报

ID:87448 发表于 2015-10-4 01:37 | 显示全部楼层
//从机源码
#include <STC15F2K60S2.H>
#include <STDIO.H>
#include "AD_UartInit.H"


uchar j;
void main()
{
DA_Pointer_Array= DA_Array;
DA_InitSpi();
AD_UartInit();
SPI_receive=0;
IE2=IE2|ESPI;   //使能SPI中断
EA=1;


while(1){
             
       for(j=0;j<144;j++)         //RAM初始化
       {
       DA_Array[j]=0;
       }          

          while(!RI);
          RI=0;
          for(j=0;j<144;j++)
          {
          TI=1;
          printf("0x%bx\n",DA_Array[j]);
          }
          DA_Pointer_Array= DA_Array;
        }
}

  void spi_isr() interrupt 9 using 1     //SPI中断服务程序 9 (004BH)
{

        SPSTAT = SPIF | WCOL;       //清除SPI状态位 0XC0
           *DA_Pointer_Array=SPDAT;
        DA_Pointer_Array++;
       
}


回复

使用道具 举报

ID:87448 发表于 2015-10-5 01:12 | 显示全部楼层
问题已经找到
回复

使用道具 举报

ID:87448 发表于 2015-10-5 01:13 | 显示全部楼层
已经完美
回复

使用道具 举报

ID:90789 发表于 2015-10-5 15:41 来自手机 | 显示全部楼层
刚想请教
回复

使用道具 举报

ID:1 发表于 2015-10-6 14:59 来自手机 | 显示全部楼层
zhou792008 发表于 2015-10-5 01:13
已经完美

怎么解决的,楼主能分享一下吗。期待
回复

使用道具 举报

ID:87448 发表于 2015-10-7 20:09 | 显示全部楼层
admin 发表于 2015-10-6 14:59
怎么解决的,楼主能分享一下吗。期待

CL.JPG CL-1.JPG
回复

使用道具 举报

ID:87448 发表于 2015-10-7 20:10 | 显示全部楼层
datasheet没仔细看 结果15f从机本身就不正常!换了15w就解决了
回复

使用道具 举报

ID:385637 发表于 2020-7-18 10:12 | 显示全部楼层
那就是代码没问题,是STC芯片的问题喽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表