当前位置: 首页 > 知识库问答 >
问题:

为什么我的SPI通信不工作?(Atmega644)

宋俊艾
2023-03-14

我正在构建一个鼓机,我已经存储了一个带有kick声音的示例头文件,它的值介于0和170之间。我想通过SPI将其发送到10位MCP4811 DAC,然后将其输出到3.5毫米音频插孔。

我有我的MISO,MOSI,SCK和复位引脚连接到我的USB编程器以及DAC。

这里是存储在"samples. h"中的音频文件的片段。

unsigned const char sample_1[2221] PROGMEM = {0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, ...}
unsigned int sample_len[1] = {2221}

因此,它是2221位的样本。我想用SPI发送到DAC,频率=22 kHz。

我使用的是一个16兆赫的晶体,所以我设置了相应的保险丝来使用它。

我使用的计时器溢出22千赫。

volatile unsigned int sample_count[1] = {0};
volatile unsigned int audio_out = 0;
volatile unsigned char spi_junk;

int main (void)
sei();
DDRB = 0b10110000; //Set MOSI, SCK and SS as output.
PORTB = (1 << PINB4) //active low on SS.

TIMSK1 = (1<<OCIE1A); //Enable interrupt
TCCR1B = (1<<WGM12) | (1<<CS11); // set CTC mode and divide clk by 8 
OCR1A = 91; //16 MHz/(8*91) ~ 22068 Hz

//SPI Init
SPCR = (1<<SPE) | (1<<MSTR);  //master, 8 MHz
SPSR = (1<<SPI2X);

ISR (TIMER1_COMPA_vect) {
    audio_out = 0;

//If play_track == 1, then the sound should be played back.
if (play_track && sample_count[0] < sample_len[0]){
   audio_out += (pgm_read_byte(&(sample_1[sample_count[0]++)));

// send audio_out to 10-bit DAC on SPI
PORTB &= ~(1<<PINB4); // B.4 (DAC /CS)
SPDR = (char) ((audio_out >> 6) & 0x000f); //byte 1 0 0 0 0 b9 b8 b7 b6
while (!(SPSR & (1<<SPIF)));
spi_junk = SPDR;

SPDR = (char) ((audio_out & 0x003f) << 2); //byte 2 b5 b4 b3 b2 b1 b0 0 0
while (!(SPSR & (1<<SPIF)));
spi_junk = SPDR;
PORTB |= (1<<PINB4);
}

我的密码设置是。

Atmega644-

MOSI -> SDI

SCK -> SCK

SS -> /CS

关于MCP4811

Vdd -> 5V

Vss -> GND

V_out -> Audio jack.

MCP4811上的其余引脚未连接到任何设备。

我已经看到,通过在液晶屏上显示audio_out值,audio_out正在按预期工作。但是没有输出到DAC。有人看到可能出了什么问题吗?

编辑:添加了我没有添加的SPI初始化。

共有2个答案

蒋嘉颖
2023-03-14
匿名用户

代码中没有SPI初始化。

添加到main()

SPSR = (1 << SPI2X);  // double speed (to get maximum of 8MHz output)
SPCR = (1 << SPE)  | (1 << MSTR); // 1:1 prescaler, master mode, SPI mode 0, SPI enable

代码中还有几点注释:

仅在完成所有初始化后使用sei(),以避免未初始化外设上发生中断。

最好先设置PB4高,然后将其设置为输出,以避免两个命令之间的PB输出低:

PORTB = (1 << PINB4) //active low on SS.
DDRB = 0b10110000; //Set MOSI, SCK and SS as output.

臧烨烁
2023-03-14

你这里的线

SPDR=(字符)(音频输出

将¨SHDN设置为0,这将关闭DAC

0=关闭设备。模拟输出不可用。VOUT引脚连接到500千欧(典型)

将位12改为1

SPDR=(字符)(音频输出

来自数据表

1=激活模式操作。VOUT可用。

 类似资料:
  • 我使用SPI通信尝试连接我的Arduino Mega 2560作为主从ADC芯片()在外部时钟模式,但我一直收到相同的值或所有零每当我运行我的代码。还有一个触摸屏(工作)连接。除了与Arduino的ADC芯片通信外,一切正常。 我尝试删除定义头,并改变时钟。也不要改变任何东西(这可能是因为其他错误)。 错误包括RB1=255;RB2=255;RB3=255或全部为零。

  • 有人能找出为什么我的不能工作。也许我错过了什么。我意识到这可能是愚蠢的没有任何更多的上下文比我所展示的,但请您询问,我将很乐意提供更多。 这是一段很大的代码,所以我不知道如何用它生成SSCE。您正在查看的是子类的构造函数,它包含3个面板。此时,只是一个。方法打开一个filechooser,然后加载选定的图像,该图像被绘制到上。图像显示良好,一切正常,除了我调整窗口大小时,没有滚动条。

  • 我今天想使用,但出现了如下错误: 所以我想我应该清除并重新安装(如下所示)https://www.rosehosting.com/blog/how-to-install-pip-on-ubuntu-16-04/)但仍然得到: 我怎样才能提高我的水平

  • 下面是一个链表的简单实现。我刚刚添加了相关代码。首先,我向列表中添加一些值,10,990和10000。当我搜索相同的值时,对于key=10,我得到true,但是对于key=990和key=10000得到false,尽管它应该是true。另外,如果我将第二个值从990更改为99,并搜索key=99,这一次我得到的是true。 我不确定是否使用泛型类型。我想我在那里做错了什么。因为如果我用int替换泛

  • 问题内容: 首先,创建数据库。 我将“南”添加到已安装的应用程序中。然后,我转到本教程:http : //south.aeracode.org/docs/tutorial/part1.html 本教程告诉我要这样做: 太好了,现在我迁移了。 但这给了我这个错误… 因此,我使用Google(它永远都行不通。因此我在Stackoverflow上问了870个问题),并得到以下页面:http : //gr