不知道算不算是一個ch582的bug

Ch582作為spi slave,用dma發(fā)送接收的時候

如果ch582先是dma接收,然后轉(zhuǎn)為dma發(fā)送,則第一次發(fā)送是從dma緩沖區(qū)第8個字節(jié)開始發(fā)送,而不是第一個字節(jié)開發(fā)發(fā)送

從第二次以后發(fā)送就正常了,不知道是怎么回事。下面的是代碼


int main()

{

? ? UINT8 i;

? ? UINT16 bEnd;

? ? UINT16 bStart;

? ? UINT16 n;

? ? UINT16 k;

? ? UINT16 len;



? ? SetSysClock(CLK_SOURCE_PLL_60MHz);


? ? /* 配置串口調(diào)試 */

? ? DebugInit();

? ? PRINT("SpiTest Start @ChipID=%02X\r\n", R8_CHIP_ID);

//#if 0

? ? /* 設(shè)備模式 */

? ? //GPIO12:CS

? ? //GPIO13:CLK

? ? //GPIO14:MOSI

? ? //GPIO15:MISO

? ? PRINT("1.spi0 mul slave mode \n");

//? ? GPIOA_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15, GPIO_ModeIN_PU);

? ? GPIOA_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14 | GPIO_Pin_15, GPIO_ModeIN_Floating); //在pcb上已經(jīng)有上拉電阻了


? ? SPI0_SlaveInit();

? ? R8_SPI0_CTRL_MOD |= RB_SPI_MST_SCK_MOD;


? ? PRINT("R8_SPI0_CTRL_MOD=%x\r\n",R8_SPI0_CTRL_MOD); //空閑時 SCK 為高電平

? ? len = 30;

? ? for(i=0;i

? ? ? ? spiBuffrevW[i] = i;

? ? for(i=0;i

? ? ? ? PRINT("%02x ", spiBuffrevW[i]);

? ? PRINT("\r\n");

? ? while (1)

? ? {

? ? ? ? //接收3次

? ? ? ? for(n = 0;n<3;n++)

? ? ? ? {

? ? ? ? ? ? PRINT("recv=\r\n");

? ? ? ? ? ? R8_SPI0_CTRL_MOD |= RB_SPI_MOSI_OE;

? ? ? ? ? ? R8_SPI0_CTRL_MOD &= ~RB_SPI_MISO_OE;

? ? ? ? ? ? R8_SPI0_CTRL_MOD |= RB_SPI_FIFO_DIR;

? ? ? ? ? ? R16_SPI0_DMA_BEG = (uint32_t)spiBuffrev;

? ? ? ? ? ? R16_SPI0_DMA_END = (uint32_t)(spiBuffrev + len);

? ? ? ? ? ? R16_SPI0_TOTAL_CNT = len;

? ? ? ? ? ? R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END | RB_SPI_IF_DMA_END;

? ? ? ? ? ? R8_SPI0_CTRL_CFG |= RB_SPI_DMA_ENABLE |RB_SPI_DMA_LOOP;

? ? ? ? ? ? bStart = 0;

? ? ? ? ? ? while (1)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? bEnd = GPIOA_ReadPortPin(GPIO_Pin_12);//檢測cs引腳是否拉高,如果拉高了則結(jié)束

? ? ? ? ? ? ? ? if(bEnd==0)

? ? ? ? ? ? ? ? ? ? bStart = 1;

? ? ? ? ? ? ? ? if(bStart && bEnd? //如果先檢測到cs拉低,然后檢測到拉高則結(jié)束

? ? ? ? ? ? ? ? ? ? ? ? || (R8_SPI0_INT_FLAG & RB_SPI_IF_CNT_END))

? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? ? ? R8_SPI0_FIFO_COUNT = 0;

? ? ? ? ? ? R8_SPI0_FIFO_COUNT1 = 0;

? ? ? ? ? ? R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;

? ? ? ? ? ? int i;

? ? ? ? ? ? PRINT("fin=%x ",bEnd);

? ? ? ? ? ? for(i=0;i

? ? ? ? ? ? ? ? PRINT("%02x ", spiBuffrev[i]);

? ? ? ? ? ? PRINT("\r\n");

? ? ? ? }


? ? ? ? //作為設(shè)備模式發(fā)送3次

? ? ? ? //spi master第一次接收到的值從8開始? 08 09 0A 0B 0C 0D 0E 0F ....

? ? ? ? //spi master第二次接收到的值從0開始? 00 01 02 03 04 05 06 07 ....

? ? ? ? //spi master第三次接收到的值從0開始? 00 01 02 03 04 05 06 07 ....

? ? ? ? //發(fā)送序列通過邏輯分析儀查看過了,應(yīng)該不是spi master端的問題

? ? ? ? for(n = 0;n<3;n++)

? ? ? ? {

? ? ? ? ? ? PRINT("Send=%p \r\n",spiBuffrevW);


? ? ? ? ? ? PRINT("Send:%p cnt=%x cnt1=%x\r\n",spiBuffrevW,R8_SPI0_FIFO_COUNT,R8_SPI0_FIFO_COUNT1);

? ? ? ? ? ? for(i=0;i

? ? ? ? ? ? ? ? spiBuffrevW[i] = i; //初始化發(fā)送值,00 01 02 03 04 05 06 07 ....

? ? ? ? ? ? R8_SPI0_CTRL_MOD |= RB_SPI_MISO_OE;

? ? ? ? ? ? R8_SPI0_CTRL_MOD &= ~RB_SPI_MOSI_OE;

? ? ? ? ? ? R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR;

? ? ? ? ? ? R16_SPI0_DMA_BEG = (uint32_t)spiBuffrevW;

? ? ? ? ? ? R16_SPI0_DMA_END = (uint32_t)(spiBuffrevW+ len);

? ? ? ? ? ? R16_SPI0_TOTAL_CNT = len;

? ? ? ? ? ? R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END | RB_SPI_IF_DMA_END;

? ? ? ? ? ? R8_SPI0_CTRL_CFG |= RB_SPI_DMA_ENABLE |RB_SPI_DMA_LOOP;

? ? ? ? ? ? bStart = 0; //cs引腳是否拉底過

? ? ? ? ? ? while (1)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? bEnd = GPIOA_ReadPortPin(GPIO_Pin_12); //檢測cs引腳是否拉高,如果拉高了則結(jié)束

? ? ? ? ? ? ? ? if(bEnd==0)

? ? ? ? ? ? ? ? ? ? bStart = 1;

? ? ? ? ? ? ? ? if(bStart && bEnd || (R8_SPI0_INT_FLAG & RB_SPI_IF_CNT_END))

? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? ? ? R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;

? ? ? ? ? ? PRINT("Send:cnt=%x cnt1=%x\r\n",R8_SPI0_FIFO_COUNT,R8_SPI0_FIFO_COUNT1);

? ? ? ? ? ? PRINT("fin=%x\r\n",bEnd);

? ? ? ? }

? ?}

? ? PRINT("END ...\n");


? ? while(1);

//#endif


? ? while(1);

}


您提供的代碼有部分缺失,請?zhí)峁┠軓?fù)現(xiàn)現(xiàn)象的工程發(fā)送到郵箱rzz@wch.cn


今天又測試了一下,發(fā)現(xiàn)了一個規(guī)律:

就是ch582作為slave用spi dma發(fā)送數(shù)據(jù)給host的時候,對兩次發(fā)送的時間間隔有要求,如果間隔太小,就會出錯

這個間隔和上一次spi clk的頻率有關(guān),頻率越高需要的時間間隔越小

如果spi頻率為10k,那么間隔需要500ms

如果spi頻率為1M,則時間間隔需要1us,也就是兩次發(fā)送之間要DelayUs(1)

如果spi頻率為4M,則兩次發(fā)送之間不需要delay


下面我再測試一下交替接收和發(fā)送的情況


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频