3246|1

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

TI MCU spi 读不出数据 [复制链接]

麻烦大家帮忙看看,我使用TI TM4C123系列产品,SPI程序如下:
void SPIInit(uint32_t ui32Base, uint32_t ui32Clock, uint32_t ui32BitRate)
{
    SPIGPIOInit();
    //
    // Configure the SPI module.
    //
    MAP_SSIConfigSetExpClk(SSI3_BASE, ROM_SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,
                           SSI_MODE_MASTER,1000000, 8);

    //
    // Enable the advanced mode of operation, defaulting to read/write mode.
    //
    MAP_SSIAdvModeSet(SSI3_BASE, SSI_ADV_MODE_READ_WRITE);

    //
    // Enable the frame hold feature.
    //
    MAP_SSIAdvFrameHoldEnable(SSI3_BASE);

    //
    // Enable the SPI module.
    //
    MAP_SSIEnable(SSI3_BASE);
}

void SPIRead(uint32_t ui32Addr, uint8_t *pui8Data,
             uint32_t ui32Count)
{
    uint32_t ui32Trash;

    //
    // Drain any residual data from the receive FIFO.
    //
    while(MAP_SSIDataGetNonBlocking(SSI3_BASE, &ui32Trash) != 0)
    {
    }

    //
    // Set the SSI module into write-only mode.
    //
    MAP_SSIAdvModeSet(SSI3_BASE, SSI_ADV_MODE_WRITE);

    //
    // Send the read command.
    //
    MAP_SSIDataPut(SSI3_BASE, CMD_READ);

    //
    // Send the address of the first byte to read.
    //
    MAP_SSIDataPut(SSI3_BASE, (ui32Addr >> 8) & 0xff);
    MAP_SSIDataPut(SSI3_BASE, ui32Addr & 0xff);

    //
    // Set the SSI module into read/write mode.  In this mode, dummy writes are
    // required in order to make the transfer occur; the SPI flash will ignore
    // the data.
    //
    MAP_SSIAdvModeSet(SSI3_BASE, SSI_ADV_MODE_READ_WRITE);

    //
    // See if there is a single byte to be read.
    //
    if(ui32Count == 1)
    {
        //
        // Perform a single dummy write, marking it as the end of the frame.
        //
        MAP_SSIAdvDataPutFrameEnd(SSI3_BASE, 0);
    }
    else
    {
        //
        // Perform a dummy write to prime the loop.
        //
        MAP_SSIDataPut(SSI3_BASE, 0);

        //
        // Loop while there is more than one byte left to be read.
        //
        while(--ui32Count != 1)
        {
            //
            // Perform a dummy write to keep the transmit FIFO from going
            // empty.
            //
            MAP_SSIDataPut(SSI3_BASE, 0);

            //
            // Read the next data byte from the receive FIFO and place it into
            // the data buffer.
            //
            MAP_SSIDataGet(SSI3_BASE, &ui32Addr);
            *pui8Data++ = ui32Addr & 0xff;
        }

        //
        // Perform the final dummy write, marking it as the end of the frame.
        //
        MAP_SSIAdvDataPutFrameEnd(SSI3_BASE, 0);

        //
        // Read the next data byte from the receive FIFO and place it into the
        // data buffer.
        //
        MAP_SSIDataGet(SSI3_BASE, &ui32Addr);
        *pui8Data++ = ui32Addr & 0xff;
    }

    //
    // Read the final data byte from the receive FIFO and place it into the
    // data buffer.
    //
    MAP_SSIDataGet(SSI3_BASE, &ui32Addr);
    *pui8Data++ = ui32Addr & 0xff;
}
用示波器测试信号,写,时钟和片选信号均正常,EEPROM的输出无信号,一直为0.我使用的EEPROM型号
是25LC512.
麻烦各位大侠了!

最新回复

本帖最后由 Study_Stellaris 于 2014-10-16 11:44 编辑 参考 \StellarisWare\examples\peripherals\ssi 下的 spi_master.c 这个例程试试  详情 回复 发表于 2014-10-16 11:28
 
点赞 关注

回复
举报

1803

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 
本帖最后由 Study_Stellaris 于 2014-10-16 11:44 编辑

参考 \StellarisWare\examples\peripherals\ssi 下的 spi_master.c 这个例程试试
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表