CH559 SPI主机模式读数据

配置了主机模式,并且bS0_DATA_DIR配置为1,在这样的配置下如何去读取从机设备的数据?

我测试的时候发现读回的数据会重复出现两次,代码如下:

//读操作


CS2 = 0;

CH559SPI0Write(0xff);

 //mDelaymS (10);

dat = CH559SPI0Read();

 //printf("recv[1]: %02x\r\n", (UINT16)dat);

CS2 = 1;


//初始化

void CH559SPI0HostInit(void)

{

    UINT8 i = 0;

    PORT_CFG &= ~bP1_OC;

    P1_DIR |= (bSCK | bMOSI | bSCS1 | bSCS2 | bSCS3 | bSCS4); //| bSCS);

    P1_IE |= bMISO;                                                            //引脚配置

    SPI0_SETUP &= ~(bS0_MODE_SLV | bS0_BIT_ORDER);                             //设置为主机模式,字节顺序为大端模式

    SPI0_CTRL |=  bS0_MOSI_OE  | bS0_SCK_OE | bS0_MST_CLK | bS0_DATA_DIR;      //MISO输出使能,SCK输出使能

    SPI0_CTRL &= ~(bS0_2_WIRE);

    //SPI0_CTRL &=  ~(bS0_DATA_DIR);                                             //主机写,默认不启动写传输,如果使能bS0_DATA_DIR,

                                                                             //那么发送数据后自动产生一个字节的时钟,用于快速数据收发

    SET_SPI0_CK(6);                                                              //6分频

    SPI0_CTRL &= ~bS0_CLR_ALL;                                                 //清空SPI0的FIFO,默认是1,必须置零才能发送数据

    CS1 = 1;

    CS2 = 1;

CS3 = 1;

CS4 = 1;

}


//写函数

void CH559SPI0Write(UINT8 dat)

{

    SPI0_DATA = dat;

    while(S0_FREE == 0);    //等待传输完成

    //printf("dat:%02X\r\n", (UINT16)dat);

//如果bS0_DATA_DIR为1,此处可以直接读取一个字节的数据用于快速读写

}

//读函数

UINT8 CH559SPI0Read()

{

    SPI0_DATA = 0xff;

    while(S0_FREE == 0);

    return SPI0_DATA;

}



您好。当bS0_DATA_DIR配置为1,读DATA寄存器和写DATA寄存器均会产生一次SPI传输,因此上面会产生三次SPI传输。写传输之后的读回传的数据需要增加延时等待从机将数据准备好。后续问题可以电话咨询:025-52635387


只有登录才能回复,可以选择微信账号登录