新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32SPI讀寫函數

        STM32SPI讀寫函數

        作者: 時間:2016-11-10 來源:網絡 收藏

        //SPIx讀寫一個字節(jié)

        本文引用地址:http://www.104case.com/article/201611/317124.htm

        //TxData:要寫入的字節(jié)

        //返回值:讀取到的字節(jié)

        u8 SPIx_ReadWriteByte(u8 TxData)

        {

        while((SPI1->SR&(1<<1))==0);

        SPI1->DR=TxData; //發(fā)送一個byte

        while((SPI1->SR&(1<<0))==0);

        returnSPI1->DR; //返回收到的數據

        }

        對于這樣的讀寫函數曾有這樣的疑惑,讀就是讀寫就寫為什么要放一起呢。這樣是不是很麻煩,查詢相關資料有如下解答。

        a)寫一個字節(jié):

        ?while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        //確保發(fā)生前Buffer為空,也就是說上一次已經發(fā)生完成

        ?SPI_I2S_SendData(SPI1, Data);

        //?往寄存器中寫入一個字節(jié)

        ?while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

        //等待接受到一個字節(jié)數據,

        為什么要這么做?加這一句的原因是為了確保這個字節(jié)已經發(fā)送出去,因為發(fā)生和接受是并行同步進行,那就是說你發(fā)生出去一個字節(jié)意味著你收到一個字節(jié)。所以這樣判斷完全沒有問題,再說必要性,如果你不加這句你就會容易犯過早拉高CS信號的錯誤(相當于檢測到收到數據,那么說明數據一定發(fā)完了),你想想如果在SPI_I2S_SendData(SPI1, Data)后面立即拉高CS是什么后果。SPI_I2S_ReceiveData(SPI1); //都會接收到的數據,看起來沒什么必要,但以用stm32的經驗推薦這樣做,也許會有意想不到的收獲。

        ?SPI_Writebyte(u8data)

        ?{

        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

        SPI_I2S_SendData(SPI1, Data);

        ?while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

        ?SPI_I2S_ReceiveData(SPI1);

        }

        b)?讀一個字節(jié):讀的時候要注意一個問題,因為從模式是沒法提供時鐘的,所以主模式下必須要在接收的同時提供時鐘。辦法就是發(fā)送一個字節(jié)來實現(xiàn),因為還是上面說的,發(fā)送一個字節(jié)就意味著收到一個字節(jié),代碼和寫完全一樣,只要把讀出來的字節(jié)保存即可。u8 SPI_Readbyte(u8data){while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(SPI1, Data);while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);return SPI_I2S_ReceiveData(SPI1);}



        關鍵詞: STM32SPI讀寫函

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 湄潭县| 衡南县| 蓬安县| 中阳县| 绵阳市| 天峨县| 白水县| 英山县| 西安市| 如东县| 沂南县| 罗江县| 眉山市| 玉田县| 张家川| 珠海市| 成都市| 禄丰县| 松潘县| 威远县| 西宁市| 武胜县| 龙岩市| 清苑县| 广南县| 荔浦县| 柏乡县| 雅江县| 大田县| 旬邑县| 铜鼓县| 长阳| 恩平市| 东乌| 驻马店市| 嘉义市| 昌图县| 十堰市| 巴南区| 和静县| 湾仔区|