我正在使用 SSI0中的 SPI 协议将 DAC084SO 连接到 Tiva C 系列 Launch Pad。
我向 所有4个通道写入相同的输入值(使用带计数器的 while 环路的三角波形)、并在通道2、3和4中获得所需的输出。 但是、我的输出通道1中的输出中断。
我粘贴了下面3个工作输出和1个中断输出的示波器屏幕截图:
我粘贴了以下代码:
#include
#include
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/ssi.h"
#include "driverlib/sysctl.h"
#include "utils/uartdio.h"
#include "utils/uartdio.h"
//! 尝试使 DAC SSI 084正常工作。 4通道。
//!
//! 此示例使用以下外设和 I/O 信号。 您必须
//! 查看这些内容并根据您自己的董事会需要进行更改:
//! - SSI0外设
//! - GPIO 端口 A 外设(用于 SSI0引脚)
//! SSI0Clk - PA2
//! - SSI0Fss - PA3
//! - SSI0Rx - PA4
//! - SSI0Tx - PA5
#define NUM_SSI_DATA 3
int
main (void)
{
uint8_t loopCount = 0;
uint16_t dacAaddress_dontUpdate = 0b0000;//写入寄存器00 A,直到 D 被写入才会更新
uint16_t dacBaddress_dontUpdate = 0b0100;//写入寄存器01 B、直到 D 被写入才会更新
uint16_t dacCaddress_dontUpdate = 0b1000;//写入寄存器10 C、直到 D 被写入才会更新
uint16_t dacDaddress_doUpdate = 0b1101;//写入寄存器11 D、更新写 D 的所有输出
//移动地址并在内部更新位8位,以便您可以使用 OR 运算符来写入最后8位
dacAdaddress_dontUpdate = dacAdaddress_dontUpdate <8;
dacBaddress_dontUpdate = dacBaddress_dontUpdate <8;
dacCaddress_dontUpdate = dacCaddress_dontUpdate <8;
dacDaddress_doUpdate = dacDaddress_doUpdate <8;
SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
//必须启用 SSI0外设才能使用。
SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
//对于本示例,SSI0与 Porta[5:2]一起使用。
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
//为端口 A2、A3、A4和 A5上的 SSI0功能配置引脚复用。
GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
GPIOPinConfigure (GPIO_PA4_SSI0RX);
GPIOPinConfigure (GPIO_PA5_SSI0TX);
//配置 SSI 引脚的 GPIO 设置。 该函数也会提供
将这些引脚的//控制到 SSI 硬件。 请参阅中的数据表
//查看每个引脚分配的函数。
//引脚分配如下:
// PA5 - SSI0Tx
// PA4 - SSI0Rx
// PA3 - SSI0Fss
// PA2 - SSI0CLK
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 |GPIO_PIN_2);
//为 TI 主控模式配置和启用 SSI 端口。 使用 SSI0系统
//时钟电源、主控模式、1MHz SSI 频率和16位数据。
//位速率必须为2MHz 或更高
SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_TI、SSI_MODE_MASTER、1000000、16);
//启用 SSI0模块。
SSIEnable (SSI0_BASE);
while (1){
//现在使用 OR 运算符将您的控制值放入输入位中
//循环计数是一个8位值。 因此仅修改父级的最后8位。
//现在将所有输入变量进一步移入4位内部。
// DAC048S 的输入变量为16位,最后4位应该是无用的。
//如果不移入内部,现在12位字的最后8位将被忽略!
SSIDataPut (SSI0_BASE、((dacAaddress_dontUpdate | loopCount)<<4);
SSIDataPut (SSI0_BASE、((dacBaddress_dontUpdate | loopCount)<<4);
SSIDataPut (SSI0_BASE、((dacCaddress_dontUpdate | loopCount)<<4);
SSIDataPut (SSI0_BASE、((dacDaddress_doUpdate | loopCount)<<4);
while (SSIBusy (SSI0_BASE)){}
loopCount++;
if (loopCount=255)
loopCount=0;
}
}
// UART 中断处理程序,主程序中的定义
//简单地说,由于我们将它放在启动 CCS 文件的 NVIC 表中,所以必须在这里执行操作。
空 UARTIntHandler (空)
{
}
是否有任何帮助说明为什么一个通道不能正常工作?





