OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12424|回复: 9

STC12C5A60S2单片机SPI

[复制链接]

36

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2012-11-11
在线时间
14 小时
发表于 2013-7-23 18:24:38 | 显示全部楼层 |阅读模式
#include"STC12C5A.h"
#define u8_t  int
//sfr P4 = 0xe8;
//STC12LE5A60S2单片机自带SPI控制器连接
//sbit VCC1 = P2^0;// VCC1 NO USE
//sbit SON = P1^6 ;// MISO
//sbit SIN = P1^5 ;// MOSI
//sbit SCKN = P1^7 ; // SCK
sbit CSN = P1^4 ;// 28J60 -- CS
//sbit RSTN = P3^5 ; //RST, no use
//sbit INTN = P3^3 ; // INT, no use
sbit key=P1^0;
void init_spi(void)
{
//SSIG = 1;   //忽略SS脚
//SPEN = 1;   //允许SPI工作
//DORD = 0;   //先传高位MSB
//MSTR = 1;   //设置单片机为主机
SPCTL = 0xD0; //SPI Control Register SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 0000,0100
SPSTAT = 0xC0; //
//IE2 |= 0x02; //允许SPI中断控制位
}

void WriteByte(u8_t temp)
{
SPDAT = temp;
while(!(SPSTAT & 0x80));
SPSTAT = 0xC0;
}

u8_t ReadByte(void)
{
idata u8_t temp;
//SPSTAT = 0xC0;
SPDAT = 0x00;
while(!(SPSTAT & 0x80));
temp = SPDAT;
SPSTAT = 0xC0;
return temp;
}
void main()
{
 init_spi();
 while(1)
 {
  if(key==0)
  WriteByte(0x01);
  P0=ReadByte;
 }

}
两个单片机中只有一个按下key建的时候有反映另外一个没有反映,有反映的收到的信息的都是乱码,都是为0xff
求大神解答啊


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-7-23 19:04:08 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

21

主题

146

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
467
金钱
467
注册时间
2013-7-12
在线时间
86 小时
发表于 2013-7-23 19:59:48 | 显示全部楼层
//写一字节到SD卡,模拟SPI总线方式
void SdWrite(uchar byte)
{
    uchar i;   
    for(i=8;i;i--)
    {
        SD_CLK=0;
        SD_DI=(byte&0x80);
        byte<<=1;
        SD_CLK=1;
        }
        SD_DI=1; 
    } 
//===========================================================
//从SD卡读一字节,模拟SPI总线方式
uchar SdRead()
{
    uchar byte,i;
    for(i=8;i;i--)
    {
        SD_CLK=0;
        SD_CLK=1;
        byte<<=1;
        if(SD_DO) byte|=1;
    
    }
    return byte;
}
回复 支持 反对

使用道具 举报

36

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2012-11-11
在线时间
14 小时
 楼主| 发表于 2013-7-23 21:09:56 | 显示全部楼层
回复【3楼】SR_LI:
---------------------------------
你这个是模拟的还是用单片机内部的那个spi
回复 支持 反对

使用道具 举报

36

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2012-11-11
在线时间
14 小时
 楼主| 发表于 2013-7-23 21:10:19 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
嗯嗯,谢谢原子哥
回复 支持 反对

使用道具 举报

36

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2012-11-11
在线时间
14 小时
 楼主| 发表于 2013-7-23 21:10:56 | 显示全部楼层
回复【3楼】SR_LI:
---------------------------------
你不用选主从吗
回复 支持 反对

使用道具 举报

21

主题

146

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
467
金钱
467
注册时间
2013-7-12
在线时间
86 小时
发表于 2013-7-23 21:19:18 | 显示全部楼层
模拟的  只是两个子程序
回复 支持 反对

使用道具 举报

36

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2012-11-11
在线时间
14 小时
 楼主| 发表于 2013-7-23 22:55:41 | 显示全部楼层
回复【7楼】SR_LI:
---------------------------------
我是在想找那个硬件的,硬件的传输速度是模拟的三倍
回复 支持 反对

使用道具 举报

21

主题

146

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
467
金钱
467
注册时间
2013-7-12
在线时间
86 小时
发表于 2013-7-24 17:15:47 | 显示全部楼层
sbit SD_CS   = 1^4;   //  片选择
sbit SD_DI   = 1^5;           //  主输从入
sbit SD_DO   = 1^6;   //  主入从出
sbit SD_CLK  = 1^7;   //  时钟信号

/*spi init*/
SPDAT = 0;                     //数据寄存器清0
SPSTAT = 0xC0;              //清SPI状态SPIF和WCOL写1清0
SPCTL = 0xDC;              //1101 1100 主模式,使能,先MSB,前时钟为
                                  //下降沿,并在下降沿驱动数据,上升沿检测数据
                                          //clk_mcu/4

//写一字节到SD卡,模拟SPI总线方式 和硬件SPI
void SdWrite(uchar byte)
{
//    uchar i;   
//    for(i=8;i;i--)
//    {
//        SD_CLK=0;
//        SD_DI=(byte&0x80);
//        byte<<=1;
//        SD_CLK=1;
//        }
//        SD_DI=1; 

SPDAT=byte;
while((SPSTAT&0x80)==0);
SPSTAT=0xC0;  //SPIF写1清0 
    } 
//===========================================================
//从SD卡读一字节,模拟SPI总线方式 和硬件SPI
uchar SdRead()
{
//    uchar byte,i;
//    for(i=8;i;i--)
//    {
//        SD_CLK=0;
//        SD_CLK=1;
//        byte<<=1;
//        if(SD_DO) byte|=1;
//    
//    }
       SPDAT = 0xff;
while((SPSTAT&0x80)==0);
SPSTAT=0xC0;  //  SPIF写1清0 
    return SPDAT;
}
回复 支持 反对

使用道具 举报

9

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2012-9-10
在线时间
4 小时
发表于 2013-7-25 12:36:28 | 显示全部楼层
看"STC51单片机入门(C语言)",对STC的SPI通信讲解透彻,通俗易懂,超越宏晶官网手册。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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