VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 714|回复: 0

C语言void*数据类型转换的问题

[复制链接]
48_avatar_middle
最佳答案
0 
在线会员 发表于 2023-2-2 10:41:35 | 显示全部楼层 |阅读模式
先上代码:
bool SERCOM6_SPI_WriteRead (void* pTransmitData, size_t txSize, void* pReceiveData, size_t rxSize)
{
    bool isRequestAccepted = false;
    uint32_t dummyData = 0U;

    /* Verify the request */
    if((((txSize > 0U) && (pTransmitData != NULL)) || ((rxSize > 0U) && (pReceiveData != NULL))) && (sercom6SPIObj.transferIsBusy == false))
    {
        if((SERCOM6_REGS->SPIM.SERCOM_CTRLB & SERCOM_SPIM_CTRLB_CHSIZE_Msk) == (uint32_t)SPI_DATA_BITS_9)
        {
            /* For 9-bit transmission, the txSize and rxSize must be an even number. */
            if(((txSize > 0U) && ((txSize & 0x01U) != 0U)) || ((rxSize > 0U) && ((rxSize & 0x01U) != 0U)))
            {
                return isRequestAccepted;
            }
        }

        isRequestAccepted = true;
        sercom6SPIObj.txBuffer = pTransmitData;
        sercom6SPIObj.rxBuffer = pReceiveData;
        sercom6SPIObj.rxCount = 0U;
        sercom6SPIObj.txCount = 0U;
        sercom6SPIObj.dummySize = 0U;

        if(pTransmitData != NULL)
        {
            sercom6SPIObj.txSize = txSize;
        }
        else
        {
            sercom6SPIObj.txSize = 0U;
        }

        if(pReceiveData != NULL)
        {
            sercom6SPIObj.rxSize = rxSize;
        }
        else
        {
            sercom6SPIObj.rxSize = 0U;
        }

        sercom6SPIObj.transferIsBusy = true;

        /* Flush out any unread data in SPI read buffer */
        while((SERCOM6_REGS->SPIM.SERCOM_INTFLAG & SERCOM_SPIM_INTFLAG_RXC_Msk) == SERCOM_SPIM_INTFLAG_RXC_Msk)
        {
            dummyData = SERCOM6_REGS->SPIM.SERCOM_DATA;
            (void)dummyData;
        }

        SERCOM6_REGS->SPIM.SERCOM_STATUS |= SERCOM_SPIM_STATUS_BUFOVF_Msk;

        SERCOM6_REGS->SPIM.SERCOM_INTFLAG |= (uint8_t)SERCOM_SPIM_INTFLAG_ERROR_Msk;

        if(sercom6SPIObj.rxSize > sercom6SPIObj.txSize)
        {
            sercom6SPIObj.dummySize = sercom6SPIObj.rxSize - sercom6SPIObj.txSize;
        }

        /* Start the first write here itself, rest will happen in ISR context */
        if((SERCOM6_REGS->SPIM.SERCOM_CTRLB & SERCOM_SPIM_CTRLB_CHSIZE_Msk) == (uint32_t)SPI_DATA_BITS_8)
        {
            if(sercom6SPIObj.txCount < sercom6SPIObj.txSize)
            {
                SERCOM6_REGS->SPIM.SERCOM_DATA = *((uint8_t*)sercom6SPIObj.txBuffer);

                sercom6SPIObj.txCount++;
            }
            else if(sercom6SPIObj.dummySize > 0U)
            {
                SERCOM6_REGS->SPIM.SERCOM_DATA = 0xFFU;

                sercom6SPIObj.dummySize--;
            }
            else
            {
                /* Do nothing */
            }
        }
        else
        {
            sercom6SPIObj.txSize >>= 1U;
            sercom6SPIObj.dummySize >>= 1U;
            sercom6SPIObj.rxSize >>= 1U;

            if(sercom6SPIObj.txCount < sercom6SPIObj.txSize)
            {
                SERCOM6_REGS->SPIM.SERCOM_DATA = *((uint16_t*)sercom6SPIObj.txBuffer) & SERCOM_SPIM_DATA_Msk;

                sercom6SPIObj.txCount++;
            }
            else if(sercom6SPIObj.dummySize > 0U)
            {
                SERCOM6_REGS->SPIM.SERCOM_DATA = 0xFFFFU & SERCOM_SPIM_DATA_Msk;

                sercom6SPIObj.dummySize--;
            }
            else
            {
                /* Do nothing */
            }
        }

        if(rxSize > 0U)
        {
            /* Enable ReceiveComplete  */
            SERCOM6_REGS->SPIM.SERCOM_INTENSET = (uint8_t)SERCOM_SPIM_INTENSET_RXC_Msk;
        }
        else
        {
            /* Enable the DataRegisterEmpty  */
            SERCOM6_REGS->SPIM.SERCOM_INTENSET = (uint8_t)SERCOM_SPIM_INTENSET_DRE_Msk;
        }
    }

    return isRequestAccepted;
}

bool SERCOM6_SPI_Read(void* pReceiveData, size_t rxSize)
{
    return SERCOM6_SPI_WriteRead(NULL, 0U, pReceiveData, rxSize);
}
接收到的数据在pReceiveData里。
我想在一个程序里调用它,如下:
unsigned char Read_W5500_1Byte(unsigned short reg)
{
        unsigned char i;
    void* pReceiveData=NULL;
       
        GPIO_PC06_Clear();                               
        SPI1_Send_Short(reg);
        SPI1_Send_Byte(FDM1|RWB_READ|COMMON_R);


        i=SERCOM6_SPI_Read1();
    SERCOM6_SPI_Read(pReceiveData, 1);
       
    i=(unsigned char)pReceiveData;
    GPIO_PC06_Set();
        return i;
}
这样写行吗?我总觉得不靠谱。
请高手指教,谢谢!




上一篇:请问jsoncpp怎么解析utf8字符串
下一篇:老师封装的CTabSheet 类使用Tab控件中出现的问题
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-9-29 19:31

Powered by CcTry.CoM

© 2009-2021 cctry.com

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