微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > IO口模拟SPI求助,毕业设计急用!

IO口模拟SPI求助,毕业设计急用!

时间:10-02 整理:3721RD 点击:
大家好,小弟毕业设计卡住了现在很急快没时间了,求大家帮忙,我使用的是NEC的单片机UPD79F9211,我现在想使SPI通信,可是这款单片机没有SPI,所以需要模拟SPI,由于小弟以前没学过单片机,所以这方面真的不懂,希望做过用IO口模拟SPI的高手可以发一份程序给我,小弟拜谢,毕业设计急用!小弟新手,只有1个积分,希望帮忙

小弟的邮箱zhaoshuyehit@126.com,望帮忙!1

#include "common.h"
_Bool MOSI @PA_ODR : 1; /* 5; */
_Bool MISO @PD_IDR : 2; /* 2; */
_Bool SCK @PC_ODR : 7; /* 3; */
_Bool CSS @PC_ODR : 6; /* 4; */
/** @fn : spi_sim_configuration(void)
* @brief :spi引脚配置函数
* @param  : None
* @return : None
*/
void spi_sim_configuration(void)
{
    PA_DDR |= BIT1;
    PA_CR1 |= BIT1;
    PA_CR2 &= ~(BIT1);
    PA_ODR &= ~BIT1;
    PD_DDR &= ~BIT2;
    PD_CR1 &= ~BIT2;
    PD_CR2 &= ~(BIT2);
    PD_ODR &= ~BIT2;
    PC_DDR |= BIT7;
    PC_CR1 |= BIT7;
    PC_CR2 &= ~(BIT7);
    PC_ODR &= ~BIT7;
    PC_DDR |= BIT6;
    PC_CR1 |= BIT6;
    PC_CR2 &= ~(BIT6);
    PC_ODR |= BIT6;
}
/** @fn : spi_delay(void)
* @brief :频率延时函数
* @param  : None
* @return : None
*/
void spi_delay(void)   
{
   _nop_();
         _nop_();
         _nop_();
         _nop_();
}
/** @fn :  spi_write_read_word(u16 dat)
* @brief : 读写双字节函数
* @param  : 发送的数据
* @return : 读取的数据
*/
u16 spi_write_read_word(u16 wData)
{
    u8 i;
    u16 wTemp = 0;
    SCK = 0;
   
    for (i = 0; i < 16; i++)
    {
        if (wData & 0x8000)
        {
            MOSI = 1;
        }
        else
        {
            MOSI = 0;
        }
        spi_delay();
        wData <<= 1;
        SCK = 1;
        
        spi_delay();
        wTemp <<= 1;
        
        if (MISO)
        {
            wTemp++;
        }
        SCK = 0;
    }
    return wTemp;
}
/** @fn :  spi_send_12bit_adress(u16 wAddress,u16 wDir)
* @brief : spi地址发送函数
* @param  : wAddress 寄存器地址
             wDir     读写方向
* @return : NONE
*/

void spi_send_12bit_adress(u16 wAddress,u16 wDir)
{
    if(wDir==SPI_DR_R)
    {
        wAddress |= SPI_DR_R;
    }
    else
    {
        wAddress &= SPI_DR_W;
    }
    spi_write_read_word(wAddress);
}
/** @fn :  spi_reg_read(u16 wRegAddr)
* @brief : spi读寄存器函数
* @param  : wAddress 寄存器地址
* @return : 读取的数据
*/
u16 spi_reg_read(u16 wRegAddr)
{
    u16 wReadData = 0;
    CS_LOW();
      
    spi_send_12bit_adress(wRegAddr,SPI_DR_R);
    spi_delay();
    spi_delay();
    spi_delay();
    spi_delay();
    wReadData = spi_write_read_word(VD_ST_DUM);
    CS_HIG();
   
    return wReadData;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top