This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好!
我使用的是 SPI 从设备。
这要求主机发送一个8字节命令、并且从器件用一个 IRQ 进行响应、以使主机发出两个字节的模式更改(主机读取或主机写入)。
发送这两个模式更改字节时、预计将接收到8个字节的信息。
在浏览 Simplelink CC13XX SPI.h 示例时、我只注意到 TX 和 RX 缓冲区大小是相同的。
有人知道如何发送2个字节和接收8个字节吗?
我已经试过这个想法,但它不适合我。
transaction.count = 2;
transaction.txBuf =&data;
transaction.count = 8;
transaction.rxBuf =&RXdata;
spiTransferOk = SPI_TRANSMIT (REF2_SPI、&TRANSACTION);
此致。
不确定我是否理解问题、查看您尝试实现的 SPI 图将会有所帮助。
但是、如果您要从从器件读取8个字节、则主器件需要生成时钟并在 MOSI 线路上发送数据。 如果对从端没有什么要求、您可以发送所需的任何虚拟字节。
假设您需要类似如下的内容:
事务需要为10个字节(两个模式更改字节和8个虚拟字节)、并且从器件将在接收到模式更改字节后发送8个数据字节。 接收到的前两个字节无关、除非从器件在此处发送有用的内容。
正如我所说的,如果我不知道你们到底在做什么,就不可能作出更具体的回答。
Siri
你好、Siri。
下面是我希望实现的 SPI 波形图。
仔细观察 IRQ 和 CS 信号。
感谢您的帮助
这是我为 L6470步进驱动器执行的操作。 此函数获得3个字节。
uint32_t GetParam3(uint8_t param) { uint8_t rxdata = 0; uint32_t data = 0; // Send command MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4); SPI_transmitData(EUSCI_B0_BASE, GET_PARAM | param); while (!(SPI_getInterruptStatus(EUSCI_B0_BASE, EUSCI_SPI_TRANSMIT_INTERRUPT))); while (!(SPI_getInterruptStatus(EUSCI_B0_BASE, EUSCI_SPI_RECEIVE_INTERRUPT))); // should be 0 rxdata = SPI_receiveData(EUSCI_B0_BASE); MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4); MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4); // Get MSB SPI_transmitData(EUSCI_B0_BASE, NOP); while (!(SPI_getInterruptStatus(EUSCI_B0_BASE, EUSCI_SPI_TRANSMIT_INTERRUPT))); while (!(SPI_getInterruptStatus(EUSCI_B0_BASE, EUSCI_SPI_RECEIVE_INTERRUPT))); rxdata = SPI_receiveData(EUSCI_B0_BASE); data = (rxdata << 16); MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4); MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4); // Get middle bit SPI_transmitData(EUSCI_B0_BASE, NOP); while (!(SPI_getInterruptStatus(EUSCI_B0_BASE, EUSCI_SPI_TRANSMIT_INTERRUPT))); while (!(SPI_getInterruptStatus(EUSCI_B0_BASE, EUSCI_SPI_RECEIVE_INTERRUPT))); rxdata = SPI_receiveData(EUSCI_B0_BASE); data = data | (rxdata << 8); MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4); MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4); // Get Second Byte SPI_transmitData(EUSCI_B0_BASE, NOP); while (!(SPI_getInterruptStatus(EUSCI_B0_BASE, EUSCI_SPI_TRANSMIT_INTERRUPT))); while (!(SPI_getInterruptStatus(EUSCI_B0_BASE, EUSCI_SPI_RECEIVE_INTERRUPT))); rxdata = SPI_receiveData(EUSCI_B0_BASE) ; data |= rxdata; MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4); return data; }
请注意、第一个字节是我需要的参数、然后我发送 NOPS 以获取其他字节。
我从 SDK 中获取了以下 SPI 主设备示例并将其进行了很大简化。
unsigned char masterRxBuffer[8]; unsigned char masterTxBuffer[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; void *masterThread(void *arg0) { SPI_Handle masterSpi; SPI_Params spiParams; SPI_Transaction transaction; /* Open SPI as master (default) */ SPI_Params_init(&spiParams); spiParams.frameFormat = SPI_POL0_PHA1; spiParams.bitRate = 4000000; masterSpi = SPI_open(Board_SPI_MASTER, &spiParams); if (masterSpi == NULL) { while (1); } transaction.txBuf = (void *) masterTxBuffer; transaction.rxBuf = (void *) masterRxBuffer; while(1) { transaction.count = 2; // Whatever the MODE CHANGE instruction is masterTxBuffer[0] = 0x55; masterTxBuffer[1] = 0xCC; SPI_transfer(masterSpi, &transaction); transaction.count = 8; // 8 dummy bytes when receiving 8 bytes from the slave masterTxBuffer[0] = 0x00; masterTxBuffer[1] = 0x00; SPI_transfer(masterSpi, &transaction); usleep(10000); } }
在 SPI 上、如下所示:
我的主器件未连接到任何从器件、因此在 MISO 上不返回任何内容、也没有中断线路
Siri
尊敬的 Keith Barkley:
非常感谢您的贡献。
此致。
你好、Siri。
非常感谢您的帮助:)
发送虚拟字节的概念为我解决了部分问题。
我将根据提供的信息和示例继续测试、获得结果后、我将立即报告测试结果。
再让人怀疑的是、如何控制 CS 引脚状态变化时间? 在本例中、我将其路由到 DIO12引脚上、这与默认的 SPI 实现不对应。
此致。
CS 信号拉低和拉高时的时间由驱动器实现决定、不是可从应用中配置的参数。 你为什么要改变?
请参阅以下博文、了解如何将 SPI 引脚分配给 CC1310 Launchpad 上未使用的引脚。
(+) LAUNCHXL-CC1310:GPIO 引脚的配置过程-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛
Siri
在本例中、我使用3线 SPI 以便我控制 CS。 它是一个 GPIO (2.4)、正如我的代码中显示的那样、完全受程序控制。
你好、Siri。
您能检查图像吗?
SPI 驱动器的低至高 CS 时间与从机模块所需的实现不匹配。
我将以250 KHz 的速率从主器件发送帧、并且未从器件得到响应。
我想知道微秒差是否会真正影响我的通信。
有没有什么办法可以改善这种局面?
此致。
我忘记了在这些测试中、我使用的是 SPI 驱动器的默认引脚配置。
如果 CSn 信号的时序不是 从机模块的问题、需要咨询从机模块供应商、我无法回答。
如果您想手动控制 CSn、您可以 在 spiCC26XXDMAHWAttrs 中设置.csnPin = PIN_UN利用 、然后设置 CSn 信号以由应用程序控制(请查看我1月26日提到的帖子有关如何执行此操作)。
应用程序可能如下所示:
unsigned char masterRxBuffer[1]; unsigned char masterTxBuffer[1]; void *masterThread(void *arg0) { SPI_Handle masterSpi; SPI_Params spiParams; SPI_Transaction transaction; /* Open SPI as master (default) */ SPI_Params_init(&spiParams); spiParams.frameFormat = SPI_POL0_PHA1; spiParams.bitRate = 250000; masterSpi = SPI_open(Board_SPI_MASTER, &spiParams); if (masterSpi == NULL) { while (1); } transaction.txBuf = (void *) masterTxBuffer; transaction.rxBuf = (void *) masterRxBuffer; transaction.count = 1; GPIO_setConfig(Board_SPI0_CSN, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_HIGH); while(1) { GPIO_write(Board_SPI0_CSN, 0); masterTxBuffer[0] = 0x55; SPI_transfer(masterSpi, &transaction); GPIO_write(Board_SPI0_CSN, 1); CPUdelay(DELAY_TIME); GPIO_write(Board_SPI0_CSN, 0); masterTxBuffer[0] = 0xCC; SPI_transfer(masterSpi, &transaction); GPIO_write(Board_SPI0_CSN, 1); CPUdelay(DELAY_TIME); uint8_t i = 0; for(i = 0; i < 8; i++) { GPIO_write(Board_SPI0_CSN, 0); masterTxBuffer[0] = 0x00; SPI_transfer(masterSpi, &transaction); GPIO_write(Board_SPI0_CSN, 1); CPUdelay(DELAY_TIME); } usleep(10000); } }
Siri
你好,Siri。
通过应用所提供信息中的概念、我的问题已经得到解决。
非常感谢。