打印

同一IC:78F9234模拟SPI读外设数据不同端口成败问题

[复制链接]
1285|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cos12a|  楼主 | 2014-5-17 14:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
同一IC:78F9234模拟SPI读外设数据
设置不同IO端口,P0和P3都无**确读入外设数据,设置为P2却能正确读写外设数据.其它程序不变.
时钟为1MHZ.所有 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问题,还是....?

相关帖子

沙发
zhongfabai| | 2014-5-17 17:34 | 只看该作者
本帖最后由 zhongfabai 于 2014-5-17 17:39 编辑

(改代码的同时,硬件电路也正确地作相应的更改了吗?)试看看是不是一些特殊功能寄存器没配置好?(例如中断,AD转换之类的)

另外,那个内部上拉应该不用开也能够正常工作的。

使用特权

评论回复
板凳
dirtwillfly| | 2014-5-18 10:12 | 只看该作者
使用P0和P3IO口时,要注意IO配置啊

使用特权

评论回复
地板
cos12a|  楼主 | 2014-5-19 12:36 | 只看该作者
P0口,是纯IO口,没有复用.P2口,是AD口,P3口有中断等复用.
看DATASHEET也没有指出端口不同.
硬件连接是有改的.IO配置,在初始化时已经更新.

使用特权

评论回复
5
cos12a|  楼主 | 2014-5-20 12:47 | 只看该作者
用示波器测试,P2口与其它口波形一样.
奇怪,示波器探头接触SDIO接收正常了.拿掉就不正常了.探头地也不能与IC共地,悬浮才行.
是不是这个IC太不稳定了.还是怎么了.NEC的78F9234.除P2口正常.P0,P3,P4口都不正常.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

784

帖子

4

粉丝