spi电机spi_CSN脚作用

spi电机spi_CSN脚作用

从已知信息说,

spi_CSN属于硬件选址,拉低有效
也就是拉低,选择与对应spi节点设备通信

#include "NRF24L01.h" #include "spi.h" #include "main.h" //const uint8_t TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //·¢Ë͵ØÖ· //const uint8_t RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //½ÓÊÕµØÖ· uint8_t TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //·¢Ë͵ØÖ· uint8_t RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //½ÓÊÕµØÖ· uint8_t rxBuffer; void NRF_WriteBuf(uint8_t reg, uint8_t *buf, uint8_t len) { CSN_L; HAL_SPI_Transmit(&hspi1, &reg, 1, 100); HAL_SPI_Transmit(&hspi1, buf, len, 100); CSN_H; } void NRF_Init(void) { CE_L; // ???CE?? CSN_H; // ???CSN?? HAL_Delay(100); // ?????? // 1. ???????(?????????) // ????:PRIM_RX=0;??:PWR_UP=1;??CRC:EN_CRC=1 NRF_WriteReg(NRF_REG_CONFIG, 0x0E); // 0x0E = 00001110 // ??CONFIG??????(??!) uint8_t config = NRF_ReadReg(NRF_REG_CONFIG); // 2. ??????(?????) NRF_WriteReg(NRF_REG_SETUP_AW, 0x03); // ????5?? NRF_WriteReg(NRF_REG_EN_AA, 0x01); // ????0???? NRF_WriteReg(NRF_REG_EN_RXADDR, 0x01); // ????0???? NRF_WriteReg(NRF_REG_RF_CH, 0x02); // ????2 NRF_WriteReg(NRF_REG_RF_SETUP, 0x07); // ??2Mbps,??0dBm NRF_WriteReg(NRF_REG_RX_PW_P0, 0x01); // ??????1?? NRF_WriteBuf(NRF_REG_TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); NRF_WriteBuf(NRF_REG_RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); uint8_t cmd_flush_tx = NRF_CMD_FLUSH_TX; CSN_L; HAL_SPI_Transmit(&hspi1, &cmd_flush_tx, 1, HAL_MAX_DELAY); CSN_H; uint8_t fifo_status = NRF_ReadReg(NRF_REG_FIFO_STATUS); CE_L; HAL_Delay(10); } //¶ÁÈ¡¼Ä´æÆ÷ uint8_t NRF_ReadReg(uint8_t reg) { uint8_t cmd = reg | 0x01; uint8_t value; CSN_L; HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY); HAL_SPI_Receive(&hspi1, &value, 1, HAL_MAX_DELAY); CSN_H; return value; } //дÈë¼Ä´æÆ÷ void NRF_WriteReg(uint8_t reg, uint8_t value) { uint8_t cmd = reg & 0xFE; // ???:?????&0xFE CSN_L; HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY); HAL_SPI_Transmit(&hspi1, &value, 1, HAL_MAX_DELAY); CSN_H; uint8_t verify = NRF_ReadReg(reg); } //дÈ뺯Êý uint8_t NRF_SendByte(uint8_t data) { // 1. ??????????(??SPI????) uint8_t cmd_flush_tx = NRF_CMD_FLUSH_TX; uint8_t cmd_w_tx_payload = NRF_CMD_W_TX_PAYLOAD; // 2. ????FIFO CSN_L; HAL_SPI_Transmit(&hspi1, &cmd_flush_tx, 1, HAL_MAX_DELAY); // ???????? CSN_H; // 3. ???????FIFO CSN_L; HAL_SPI_Transmit(&hspi1, &cmd_w_tx_payload, 1, HAL_MAX_DELAY); // ???????? HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY); CSN_H; // 4. ????(CE??10us????) CE_H; __NOP();__NOP();__NOP();__NOP();__NOP(); // ?10us(??MCU????) CE_L; // 5. ????????? uint32_t timeout = 0; while(1) { uint8_t status = NRF_ReadReg(NRF_REG_STATUS); // ????(TX_DS????) if (status & (1 << 5)) { NRF_WriteReg(NRF_REG_STATUS, status | (1 << 5)); // ?????? return 1; } // ????(????????) if (status & (1 << 4)) { NRF_WriteReg(NRF_REG_STATUS, status | (1 << 4)); // ?????? // ????FIFO,???????? CSN_L; HAL_SPI_Transmit(&hspi1, &cmd_flush_tx, 1, HAL_MAX_DELAY); CSN_H; return 0; } // ????(?10ms,??????) if (timeout++ > 10000) { return 0; } __NOP(); // ????,??CPU?? } } //¶ÁÈ¡º¯Êý uint8_t NRF_ReceiveByte(uint8_t *data) { uint8_t status = NRF_ReadReg(NRF_REG_STATUS); if (status & (1 << 6)) { CSN_L; HAL_SPI_Transmit(&hspi1, (uint8_t*)(NRF_CMD_R_RX_PAYLOAD), 1, HAL_MAX_DELAY); HAL_SPI_Receive(&hspi1, data, 1, HAL_MAX_DELAY); CSN_H; NRF_WriteReg(NRF_REG_STATUS, 1 << 6); CSN_L; HAL_SPI_Transmit(&hspi1, (uint8_t*)(NRF_CMD_FLUSH_RX), 1, HAL_MAX_DELAY); CSN_H; return 1; } return 0; } 发送不出数据
最新发布
08-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张海森_168820

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值