SPI

新手对于SPI的理解

实验中定义一个数组


uint8_t datai={ 0xAC,0x0E };

配置spi为16位数据长度

hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
hspi1.Init.CRCPolynomial = 10;
HAL_SPI_Init(&hspi1);

利用


HAL_SPI_Transmit(&hspi1,datai,1,0xff);

来发送,
用示波器观察波形得出数据按照接收顺序来是: 0x0E , 0xAC
那么我能不能这样理解呢?
如果用上面的16位配置发送一个预置的16位数据0x1234,
那么我是不是应该初始化这个数据为数组形式data={0x34,0x12}
注意上面的数组值的顺序.......

好,我去测试下.....

测试的结果正如我预期的那样,
求达人确认我是不是可以这样理解?
理解的对不对??

那么如果我配置为8位数据呢?
一次发送两个8位应该也可以得到这样的结果,那么数组的顺序应该是怎样的??
首先,我初始一个数组data={0x12,0x34}
利用HAL_SPI_Transmit(&hspi1,datai,2,0xff):发送

测试得到的结果,按照示波器接收的顺序来是0x1234

那么以后用SPI的时候,就可以直接利用8位的即可了.......
将16位的数据拆分为8位的然后发送,

不知道,8位和16位发送有什么区别??

有知道的吗?
新手求教

已邀请:

admin

赞同来自:

Hal库函数的SPI能不能发送11位的数据?????

有个芯片通信只需要11位数据,然而stm32是8位和16位的

经过测试,利用库中的发送16位过去,该芯片会抽风..数据是错误的,也就是说,
这个芯片将11位数据之后的5个数据保留下来等待下次6位数据合成了......
这样就导致数据发送的格式错误了....

所以,只能利用IO口来模拟SPI通信了...
幸好这个芯片只是接收数据,不会返回,要不然该怎么模拟啊??
为什么我用示波器捕捉不到啊。。还是什么原因了?我示波器看到的就是杂波。。

lpxv - 90后电子神技研究生

赞同来自:

看附件吧,我写的回复发不了,

lpxv - 90后电子神技研究生

赞同来自: 松璟

我们看到源代码,16位发送这里使用了强制转换,
u8强制转换为u16的时候,小端模式,低位在低地址
所以uint8_t datai={ 0xAC,0x0E };强制转换出来就是0X0EAC,
问题就是出在这里,
你在数据定义的时候
uint8_t datai={ 0xAC,0x0E };
为啥不定义为uint16_t datai这样的数组
这样就避免了,

好心情

赞同来自: admin cat_li

SPI中 datasize可以指定4-16bit数据,在SPI_DR寄存器中无论是字节还是字,数据总是右对齐,通讯时,只有数据字长范围内的位会随时钟输出
如下图,左侧只有0-->5位会输出,右侧只有0-->13位会输出

使用单线模式时,主机的MISO,从机的MOSI都可以作为普通IO使用。

图片贴不过来,看下面网址

http://www.cnblogs.com/cat-li/p/4951225.html

admin

赞同来自:

blob.png

blob.png

要回复问题请先登录注册