繁体   English   中英

ATMEGA32 UART通讯

[英]ATMEGA32 UART Communication

我正在尝试在ATMEGA32中进行串行通信,但我有一个问题:

在异步串行通信中, UBRRHUCSRC寄存器都位于同一位置。 我不知道该位置的哪些条件将充当UBRRH ,对于哪些条件,它将充当UCSRC 根据分配给这些寄存器的工作,我需要为每个寄存器使用不同的值

在数据表中,他们提到了在两个寄存器之间进行选择时使用URSEL位,但以某种方式我没有得到。

答案是:是的, URSEL位。 根据数据表:

在对该I / O位置进行写访问时,写入值的高位USART寄存器选择(URSEL)位控制将要写入的两个寄存器中的哪一个。 如果在写操作期间URSEL为零,则将更新UBRRH值。 如果URSEL为1,则UCSRC设置将被更新。

这意味着,无论您要向UCSRC写入什么值,都应将URSEL位置1(确保URSEL1 ):

UCSRC = (1<<URSEL)| ... whatever else ...

当您写入UBRRH ,请确保URSEL位必须为零。 这是一些不同的方法:

UBRRH = (0<<URSEL)| ... whatever else ...  // just showing that URSEL isn't set
UBRRH = ...some value...                   // simple not setting URSEL
UBRRH = (someValue)&(~(1<<URSEL)           // Ensuring that URSEL isn't set

URSEL位只是高位。 因此,无论您写入UCSRC值,都将高位(位7)设置(打开,使1 )。 并且在写入UBRRH ,请确保清除了第7位。 另一种思考的方式是,您写入UBRRH每个值都必须小于128。要将您要写入UCSRC每个值都加128:它将打开第7位。这只是一种解释方式,上面的代码更加清晰。


怎么做? 我不知道,我不是uC设计师。 可能是相同的IO位置映射到了处理器中的两个不同的寄存器。 假设您有一个名为foo的寄存器,当您向其写入值时,uC会检查高位是否已设置。 如果是,则将值写入内部存储器位置1 ;如果不是,则将值写入内部存储器位置2


如果正确使用了URSEL位,则表示这些值已正确写入。 您的测试未显示正确的值,因为您没有正确阅读它们。 数据表的第162页:

对UBRRH或UCSRC寄存器进行读访问是一个更复杂的操作。 但是,在大多数应用中,几乎不需要读取任何这些寄存器。

读取访问由定时序列控制。 读取I / O位置一次将返回UBRRH寄存器的内容。 如果在先前的系统时钟周期中读取了寄存器位置,则在当前时钟周期中读取寄存器将返回UCSRC内容。 请注意,读取UCSRC的定时序列是原子操作。 因此,在读取操作期间必须控制中断(例如,通过全局禁用中断)。

因此,当您第一次阅读UBRRH / UCSRC时,您会得到UBRRH 如果您立即再次阅读,则会阅读UCSRC 但是,正如文档所建议的那样,没有真正的理由来读取这些寄存器。 似乎您不信任数据表,但这是一个错误:数据表是有关此类问题的最佳信息来源:没有数据表,我们将无处可寻。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM