WCH沁恒单片机
直播中

李梅

7年用户 1366经验值
私信 关注
[问答]

CH559 SPI将bS0_DATA_DIR配置为1,在这样的配置下如何去读取从机设备的数据?

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

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


CS2 = 0;
CH559SPI0Write(0xff);
//mDelaymS (10);
dat = CH559SPI0Read();
//printf("recv[1]: %02xrn", (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:%02Xrn", (UINT16)dat);
//如果bS0_DATA_DIR为1,此处可以直接读取一个字节的数据用于快速读写
}
//读函数
UINT8 CH559SPI0Read()
{
    SPI0_DATA = 0xff;
    while(S0_FREE == 0);
    return SPI0_DATA;
}



回帖(1)

马丽

2022-6-29 09:58:58
您好。当bS0_DATA_DIR配置为1,读DATA寄存器和写DATA寄存器均会产生一次SPI传输,因此上面会产生三次SPI传输。写传输之后的读回传的数据需要增加延时等待从机将数据准备好。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分