搜索
bottom↓
回复: 3

同一IC:78F9234 SPI 不同IO输入成败问题

[复制链接]

出0入0汤圆

发表于 2014-5-17 13:57:29 | 显示全部楼层 |阅读模式
同一IC:78F9234模拟SPI读外设数据
设置不同IO端口,P0和P3都无法正确读入外设数据,设置为P2却能正确读写外设数据.其它程序不变.
时钟为1MHZ. IO口未作其它用处.IO未加上拉电阻.
IO端口定义如下:
SCS IO口不变.
#define SCS_IO                                        P12_bit.no3                //spi SCS
#define SCS_OUTPUT()                        PM12_bit.no3 = OUTPUT
#define SCS                                        P12_bit.no3                //spi SCS

采用P0口时作数据口时,无法正常读入.
/*
#define SCK_IO                              P0_bit.no0                //spi SCK
#define SCK_OUTPUT()                PM0_bit.no0 = OUTPUT
#define SCK                                P0_bit.no0                //spi SCS

#define SDIO_IO                              P0_bit.no1                //spi SDIO Read and Wirte
#define SDIO_OUTPUT()                PU0_bit.no1 = PULLUP_OFF;        PM0_bit.no1 = OUTPUT        //spi SDIO  Wirte
#define SDIO_INPUT()                PU0_bit.no1 = PULLUP_ON;        PM0_bit.no1 = INPUT                //spi SDIO  Read
#define SDIO                                P0_bit.no1

采用P2口作数据口时,正常.
#define SCK_IO                              P2_bit.no0                //spi SCK
#define SCK_OUTPUT()                PM2_bit.no0 = OUTPUT
#define SCK                                P2_bit.no0                //spi SCS

#define SDIO_IO                              P2_bit.no1                //spi SDIO Read and Wirte
#define SDIO_OUTPUT()                PU2_bit.no1 = PULLUP_OFF;        PM2_bit.no1 = OUTPUT        //spi SDIO  Wirte
#define SDIO_INPUT()                PU2_bit.no1 = PULLUP_ON;        PM2_bit.no1 = INPUT                //spi SDIO  Read
#define SDIO                                P2_bit.no1

采用P3口作数据口时,也无法正常读入.
#define SCK_IO                              P3_bit.no3                //spi SCK
#define SCK_OUTPUT()                PM3_bit.no3 = OUTPUT
#define SCK                                P3_bit.no3                //spi SCS

#define SDIO_IO                              P3_bit.no2                //spi SDIO Read and Wirte
#define SDIO_OUTPUT()                PU3_bit.no2 = PULLUP_OFF;        PM3_bit.no2 = OUTPUT        //spi SDIO  Wirte
#define SDIO_INPUT()                PU3_bit.no2 = PULLUP_ON;        PM3_bit.no2 = INPUT                //spi SDIO  Read
#define SDIO                                P3_bit.no2

IO初始化为:
        SCS_OUTPUT();
        SCS = 1;
        SCK_OUTPUT();
        SCK = 0;
        SDIO_INPUT();
        SDIO = 1;

读数据程序如下:
Uint8 ByteRead(void)
{
        Uint8 i,tmp;
    SDIO_INPUT ();
    SDIO = 1; //sdio pull high
    _nop_ ();
    _nop_ ();
    for(i = 0; i < 8; i++)
    {
        if(SDIO)
            tmp = (tmp << 1) | 0x01;
        else
            tmp = tmp << 1;

        SCK = 1;
        _nop_();
        SCK = 0;
    }
    _nop_ ();
    _nop_ ();
    return tmp;
}
写数据如下:
void ByteSend(Uint8 src)
{
    Uint8 i;
        SDIO_OUTPUT ();
    _nop_ ();

    for(i = 0; i < 8; i++)
    {
        if(src & 0x80)
            SDIO = 1;
        else
            SDIO = 0;

                _nop_();
        SCK = 1;
        _nop_();
        SCK = 0;
        src = src << 1;
    }
        _nop_();
        _nop_();
        SDIO_INPUT ();
}
无法理解.程序都 一样.为何是这样,是IC问题,还是....?

出0入0汤圆

发表于 2014-5-17 22:17:55 | 显示全部楼层
示波器测试一下使用p0和p3时候有没有数据或者时钟输出来?

出0入0汤圆

 楼主| 发表于 2014-5-19 12:26:07 | 显示全部楼层
用仿真器,能读到几个数据,但都不正确.每次读的都不一样.数据量也很少.几乎都是0.
P2口读到的数据就正确.

出0入0汤圆

 楼主| 发表于 2014-5-20 12:46:04 | 显示全部楼层
奇怪,示波器探头接触SDIO接收正常了.拿掉就不正常了.探头地也不能与IC共地,悬浮才行.
是不是这个IC太不稳定了.还是怎么了.NEC的78F9234.除P2口正常.P0,P3,P4口都不正常.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-29 10:28

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

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