搜索
bottom↓
回复: 14

请大家帮我看一下51模拟SPI接口函数是否正确

[复制链接]

出0入0汤圆

发表于 2010-7-30 09:41:39 | 显示全部楼层 |阅读模式
sbit  CAN_CS=P1^4;
sbit  RESET=P1^3;
sbit  CAN_SCI=P1^2;
sbit  CAN_SCO=P1^1;
sbit  CAN_SCK=P1^0;

/****************************************/
void send_byte(uchar data1 )
{
        uint i ;
        for(i=0;i<8;i++)
        {       
            CAN_SCK=0;
                data1=(data1&0x80);
                if(data1==0x08)
                {
                   CAN_SCO=1;
                }
                else
                {
                   CAN_SCO=0;
                }
                delay_nms(1);
                CAN_SCK=1;
                data1=(data1<<1);
                delay_nms(1);          
        }               

               
               
}
/*********************************************/
uchar rv_byte(void)
{
        uint i,spi_in_data=0;
        CAN_CS=0;//片选使能
        delay_nms(5);
        for(i=0;i<8;i++)
        {       
                   CAN_SCK=0;
                delay_nms(5);
                   if(CAN_SCI==1)
                {
                        spi_in_data|=0x01;               
                }
                else
                {
                        spi_in_data=~0x01;
                }
                delay_nms(5);
                CAN_SCK=1;
                spi_in_data=spi_in_data<<1;  
        }
    return spi_in_data;
           CAN_CS=1;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-7-30 11:07:40 | 显示全部楼层
/****************************************/
void send_byte(uchar data1 )
{
uint i ;
for(i=0;i<8;i++)
{
    CAN_SCK=0;
data1=(data1&0x80); //data1将被覆盖,除最高位外其它位都是0
if(data1==0x08)
{
   CAN_SCO=1;
}
else
{
   CAN_SCO=0;
}
delay_nms(1);
CAN_SCK=1;
data1=(data1<<1);
delay_nms(1);     
}



}
/*********************************************/

出0入0汤圆

发表于 2010-7-30 11:09:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-30 12:21:44 | 显示全部楼层
else
{
spi_in_data=~0x01;
}
去掉

出0入0汤圆

 楼主| 发表于 2010-7-30 13:41:36 | 显示全部楼层
应该怎么修改呢  特别是data1=(data1&0x80); //data1将被覆盖,除最高位外其它位都是0   这里

出0入0汤圆

 楼主| 发表于 2010-7-30 13:49:05 | 显示全部楼层
那应该怎么改动呢?特别是data1=(data1&0x80); //data1将被覆盖,除最高位外其它位都是0
这句,我怎么才能只看第七位是一还是零呢

出0入0汤圆

发表于 2010-7-30 13:55:16 | 显示全部楼层
data1=(data1&0x80);
if(data1==0x08)
改成
if(data1&0x80)

出0入0汤圆

发表于 2010-7-30 14:07:04 | 显示全部楼层
void WSpi8Bit(BYTE tdata)
{
        SPI_MOSI = (BOOL)(tdata&0x80);        //1
        SPI_CLK = 1;                //上升沿
        SPI_CLK = 0;                //下降沿
       
        SPI_MOSI = (BOOL)(tdata&0x40);        //2
        SPI_CLK = 1;                //上升沿
        SPI_CLK = 0;
       
        SPI_MOSI = (BOOL)(tdata&0x20);        //3
        SPI_CLK = 1;                //上升沿
        SPI_CLK = 0;
       
        SPI_MOSI = (BOOL)(tdata&0x10);        //4
        SPI_CLK = 1;                //上升沿
        SPI_CLK = 0;
       
        SPI_MOSI = (BOOL)(tdata&0x08);        //5
        SPI_CLK = 1;                //上升沿
        SPI_CLK = 0;
       
        SPI_MOSI = (BOOL)(tdata&0x04);        //6
        SPI_CLK = 1;                //上升沿
        SPI_CLK = 0;
       
        SPI_MOSI = (BOOL)(tdata&0x02);        //7
        SPI_CLK = 1;                //上升沿
        SPI_CLK = 0;
       
        SPI_MOSI = (BOOL)(tdata&0x01);        //8
        SPI_CLK = 1;                //上升沿
        SPI_CLK = 0;
}

BYTE RSpi8Bit(void) reentrant        //可重入函数
{
        SPI_CLK = 1;
        CY = SPI_MISO;//取数据SO 1
        SPI_CLK = 0;
        #pragma ASM
        RLC A
        #pragma ENDASM

        SPI_CLK = 1;
        CY = SPI_MISO;//取数据SO 2
        SPI_CLK = 0;
        #pragma ASM
        RLC A
        #pragma ENDASM

        SPI_CLK = 1;
        CY = SPI_MISO;//取数据SO 3
        SPI_CLK = 0;
        #pragma ASM
        RLC A
        #pragma ENDASM

        SPI_CLK = 1;
        CY = SPI_MISO;//取数据SO 4
        SPI_CLK = 0;
        #pragma ASM
        RLC A
        #pragma ENDASM

        SPI_CLK = 1;
        CY = SPI_MISO;//取数据SO 5
        SPI_CLK = 0;
        #pragma ASM
        RLC A
        #pragma ENDASM

        SPI_CLK = 1;
        CY = SPI_MISO;//取数据SO 6
        SPI_CLK = 0;
        #pragma ASM
        RLC A
        #pragma ENDASM

        SPI_CLK = 1;
        CY = SPI_MISO;//取数据SO 7
        SPI_CLK = 0;
        #pragma ASM
        RLC A
        #pragma ENDASM
       
        SPI_CLK = 1;
        CY = SPI_MISO;//取数据SO 8
        SPI_CLK = 0;
        #pragma ASM
        RLC A
        #pragma ENDASM
       
        return ACC;
}

最精简的,速度最快的51模拟SPI

出0入0汤圆

发表于 2010-7-30 14:09:21 | 显示全部楼层
(*^__^*) 嘻嘻……似乎和我用的不一样啊

出0入0汤圆

发表于 2010-7-30 14:21:16 | 显示全部楼层
【7楼】 68000的程序强悍,速度没的说,ROM就多了!

出0入0汤圆

发表于 2010-7-30 14:25:41 | 显示全部楼层
【9楼】 linghu2 令狐二中
-------------------------------------------
你不会连这么点ROM也要计较吧?

出0入0汤圆

 楼主| 发表于 2010-7-30 16:32:49 | 显示全部楼层
谢谢诸位好心人了

出0入0汤圆

 楼主| 发表于 2010-7-30 16:33:28 | 显示全部楼层
谢谢诸位好心人了

出0入0汤圆

发表于 2011-3-13 13:00:39 | 显示全部楼层
回复【6楼】linghu2 令狐二中
-----------------------------------------------------------------------

好看。

出0入0汤圆

发表于 2014-1-4 16:09:32 | 显示全部楼层
看起来很厉害的样子,mark下。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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