595很常用,可以使用硬件spi进行驱动,也可以及软件驱动
官方手册这个图展示的通信时序图比较迷,我反正是看不懂
反正不管这么多了
直接上cubemx
一般来说,硬件驱动,时钟和数据传输很快,但是其他相关控制就会很慢,比如我有多个595分别用单独的io来控制RCK那就会变成下边这个样子
硬件spi驱动程序,国际惯例,直接流水灯吧
注意那个&运算符
void hc595SpiTest() { uint8_t testData=0x01; for(int i=0;i<8;i++) { rck_GPIO_Port->BRR=rck_Pin;//拉低 HAL_SPI_Transmit(&hspi1, &testData, 1, 100) ;//注意这里是取地址 rck_GPIO_Port->BSRR=rck_Pin;//拉高 HAL_Delay(500); testData<<=1; } }
或者用数组,一次发多个数据出去
void hc595SpiTest() { uint8_t testData[4] = { 0x02, 0x02, 0x02, 0x02 }; for (int i = 0; i < 8; i++) { rck_GPIO_Port->BRR = rck_Pin; //拉低 HAL_SPI_Transmit(&hspi1, testData, 4, 100); rck_GPIO_Port->BSRR = rck_Pin; //拉高 HAL_Delay(500); } }
灯亮了,就进行下一步
再mx中对spi参数进行修改
图:48M下SPI设置为12M
所以呢,就不看Rck时钟了,只看数据
发一个0x01看看
波形虽然很差了,但是通信没问题,很厉害,数字电路确实牛逼,但是不利于分析,还是先把速率调低一下把
所以,为了方便观察
还是把速率调到750k吧
再发一个0x01,好看多了
0x08
再发一个0x80
软件驱动就是比较通用,方便移植
具体可以参考
void hc595Write(uint8_t hcdata) { uint8_t i,temp ; hcrck_GPIO_Port->BRR=hcrck_Pin;//拉低 for(i=0;i<8;i++) { hcclk_GPIO_Port->BRR=hcclk_Pin;//拉低 temp=hcdata & 0x80; if(temp==0x80) { hcdata_GPIO_Port->BSRR=hcdata_Pin; //拉高 } else { hcdata_GPIO_Port->BRR=hcdata_Pin;//拉低 } hcdata<<=1; hcclk_GPIO_Port->BSRR=hcclk_Pin;//拉高 } hcrck_GPIO_Port->BSRR=hcrck_Pin;//拉高 }
发送一个0x01看一下
再发一个0x80