主题中讨论的其他器件:DAC61416、 ENERGIA
各位专家:
你好。
您是否有 C 或 C++代码来设置与 teensy 4.1和 DAC61416的 SPI 通信? DAC 应在每个通道中为我提供5V、6V、7V 和10V 的电压。
请保持安全。
此致、
乔塞尔
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.
各位专家:
你好。
您是否有 C 或 C++代码来设置与 teensy 4.1和 DAC61416的 SPI 通信? DAC 应在每个通道中为我提供5V、6V、7V 和10V 的电压。
请保持安全。
此致、
乔塞尔
你好、Joselito、
您能用代码示例参考下面 e2e 中的类似请求。 我希望它能为您提供帮助。
您好!
我们没有适用于此器件的通用 C 或 C++代码。 下面是 Tiva Energia sketch 的代码示例、可以轻松修改。
#define NUM_BYTES 3 //Number of bytes in SPI frame
//SPIClass tivacSPI0(0); // SSI0
//SPIClass tivacSPI1(1); // SSI1
//SPIClass tivacSPI2(2); // SSI2
//SPIClass tivacSPI3(3); // SSI3 on port F
SPIClass tivacSPI3_Q(4); // SSI3 on port Q
void setup() {
uint8_t initTx0[NUM_BYTES], initTx1[NUM_BYTES], initTx2[NUM_BYTES], i;
int8_t ret;
uint8_t *initPtr;
Serial.begin(9600);
Serial.print("Starting DAC81416 Example");
//tivacSPI0.begin();
//tivacSPI1.begin();
//tivacSPI2.begin();
//tivacSPI3.begin();
tivacSPI3_Q.begin();
pinMode(PD_2, OUTPUT); // Configure PD2 as CLR
digitalWrite(PD_2, HIGH); // set CLR HIGH by default
//Range: +/- 20V
initTx0[0] = 0x0A;
initTx0[1] = 0xCC;
initTx0[2] = 0xCC;
initPtr = &initTx0[0];
ret = tivacSPI3_Q.DACtransfer((uint8_t*)initPtr, (uint8_t)NUM_BYTES);
//Range: +/- 20V
initTx0[0] = 0x0B;
initTx0[1] = 0xCC;
initTx0[2] = 0xCC;
initPtr = &initTx0[0];
ret = tivacSPI3_Q.DACtransfer((uint8_t*)initPtr, (uint8_t)NUM_BYTES);
//Range: +/- 20V
initTx0[0] = 0x0C;
initTx0[1] = 0xCC;
initTx0[2] = 0xCC;
initPtr = &initTx0[0];
ret = tivacSPI3_Q.DACtransfer((uint8_t*)initPtr, (uint8_t)NUM_BYTES);
//Range: +/- 20V
initTx0[0] = 0x0D;
initTx0[1] = 0xCC;
initTx0[2] = 0xCC;
initPtr = &initTx0[0];
ret = tivacSPI3_Q.DACtransfer((uint8_t*)initPtr, (uint8_t)NUM_BYTES);
//Power-up device
initTx0[0] = 0x03;
initTx0[1] = 0x0A;
initTx0[2] = 0x84;
initPtr = &initTx0[0];
ret = tivacSPI3_Q.DACtransfer((uint8_t*)initPtr, (uint8_t)NUM_BYTES);
//Power-up all channels
initTx0[0] = 0x09;
initTx0[1] = 0x00;
initTx0[2] = 0x00;
initPtr = &initTx0[0];
ret = tivacSPI3_Q.DACtransfer((uint8_t*)initPtr, (uint8_t)NUM_BYTES);
//Enable Broadcast for all Channels
initTx0[0] = 0x05;
initTx0[1] = 0xFF;
initTx0[2] = 0xFF;
initPtr = &initTx0[0];
ret = tivacSPI3_Q.DACtransfer((uint8_t*)initPtr, (uint8_t)NUM_BYTES);
//Write Code to all Channels
initTx0[0] = 0x0F;
initTx0[1] = 0xFF;
initTx0[2] = 0xFF;
initPtr = &initTx0[0];
ret = tivacSPI3_Q.DACtransfer((uint8_t*)initPtr, (uint8_t)NUM_BYTES);
}
void loop() {
int8_t rv, ldacFlag = 0;
int32_t sampleCount;
uint8_t *txPtr;
uint8_t spiTx0[NUM_BYTES];
//Write Mid-code
spiTx0[0] = 0x10;
spiTx0[1] = 0x7F;
spiTx0[2] = 0xFF;
txPtr = &spiTx0[0];
rv = tivacSPI3_Q.DACtransfer((uint8_t*)txPtr, (uint8_t)(NUM_BYTES));
delay(100);
//Write Full-code
spiTx0[0] = 0x10;
spiTx0[1] = 0xFF;
spiTx0[2] = 0xFF;
txPtr = &spiTx0[0];
rv = tivacSPI3_Q.DACtransfer((uint8_t*)txPtr, (uint8_t)(NUM_BYTES));
delay(100);
}
//Addition to SPI.cpp
int8_t SPIClass::DACtransfer(uint8_t* datapointer, uint8_t numBytes) {
unsigned long rxtxData[MAX_BYTES];
if(numBytes > MAX_BYTES){
return -1;
}
if(datapointer == NULL){
return -1;
}
for(int byteCount=0; byteCount < numBytes; byteCount++){
rxtxData[byteCount] = datapointer[byteCount];
}
if(SSIBitOrder == LSBFIRST) {
return -1;
}
for(int byteCount=0; byteCount < numBytes; byteCount++){
ROM_SSIDataPut(SSIBASE, (uint8_t) rxtxData[byteCount]);
}
while(ROM_SSIBusy(SSIBASE));
return (int8_t) 0;
}
这里是使用广播模式更新具有相同数据的所有通道的代码示例。 您可以使用 DAC_DATA 进行修改。
在这种情况下、您需要对任何处理器上的 SPI 进行通用设置。 它如下所示:
模式:模式1 (CPOL=0、CPHA=1)
顺序:MSB 优先
CS 极性:低电平有效
字节数:3.
如果需要、您可以将 GPIO 用于 LDAC 和 CLR。
此致、
AK